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

  1. variable storage {}
  2. proc restore {caller vars} {
  3. if {![dict exists $::storage $caller]} { return }
  4. foreach var $vars {
  5. uplevel 1 [list set $var [dict get $::storage $caller $var]]
  6. }
  7. }
  8. proc save {caller vars} {
  9. foreach var $vars {
  10. dict set ::storage $caller $var [uplevel 1 [list set $var]]
  11. }
  12. }
  13.  
  14. proc persist {args} {
  15. set vars $args; unset args
  16. if {[uplevel 1 [list info exists __[info level 0]]]} { return }
  17. uplevel 1 [list set __[info level 0] exists]
  18.  
  19. set caller [lindex [info level 1]]
  20. uplevel 1 [list restore $caller $vars]
  21. catch [list uplevel 1 [info body $caller]] result options
  22. uplevel 1 [list save $caller $vars]
  23. dict incr options -level +2
  24. return -options $options $result
  25. }
  26.  
  27. proc prufa {args} {
  28. persist si
  29. incr si 42
  30. puts "si = $si"
  31. }