Posted to Tcl by Zarutian at Wed Jan 16 02:22:35 GMT 2008view pretty

variable storage {}
proc restore {caller vars} {
  if {![dict exists $::storage $caller]} { return }
  foreach var $vars {
    uplevel 1 [list set $var [dict get $::storage $caller $var]]
  }
}
proc save {caller vars} {
  foreach var $vars {
    dict set ::storage $caller $var [uplevel 1 [list set $var]]
  }
}

proc persist {args} {
  set vars $args; unset args
  if {[uplevel 1 [list info exists __[info level 0]]]} { return }
  uplevel 1 [list set __[info level 0] exists]

  set caller [lindex [info level 1]]
  uplevel 1 [list restore $caller $vars]
  catch [list uplevel 1 [info body $caller]] result options
  uplevel 1 [list save $caller $vars]
  dict incr options -level +2
  return -options $options $result 
}

proc prufa {args} {
  persist si
  incr si 42
  puts "si = $si"
}