Posted to Tcl by Zarutian at Wed Jan 16 02:22:35 GMT 2008view raw
- 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"
- }