fork(1) download
  1. proc closure {env params body} {
  2. set ns [uplevel 1 { namespace current }]
  3. set body [list with __scope__ $body]
  4. set lambda [list $params $body $ns]
  5. return [list $env $lambda]
  6. }
  7. proc with {scopeVar body} {
  8. uplevel 1 [list upvar 1 $scopeVar __scope__]
  9. uplevel 1 [list dict with __scope__ $body]
  10. }
  11. proc applyc {closureVar args} {
  12. upvar 1 $closureVar closure
  13. lassign $closure __scope__ lambda
  14. try { apply $lambda {*}$args } on ok result { set closure [list $__scope__ $lambda]; return $result }
  15. }
  16. proc invokec {args} {
  17. uplevel 1 {*}$args
  18. }
  19.  
  20. set i -1
  21.  
  22. set counter [closure {i 0} {{n 1}} { incr i $n }]
  23.  
  24. puts "MAIN: [applyc counter]"
  25. puts "MAIN: [applyc counter]"
  26.  
  27. proc test {localcounter} {
  28. puts "TEST: [applyc localcounter]"
  29. puts "TEST: [applyc localcounter]"
  30. }
  31.  
  32. test $counter
  33.  
  34. puts "MAIN: [applyc counter]"
  35. puts "I: $i"
Success #stdin #stdout 0s 15776KB
stdin
Standard input is empty
stdout
MAIN: 1
MAIN: 2
TEST: 3
TEST: 4
MAIN: 3
I: -1