fork 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. set counter [closure {i 0} {{n 1}} { incr i $n }]
  20.  
  21. puts [applyc counter]
  22. puts [applyc counter 3]
  23.  
  24. proc test {} {
  25. return [list applyc counter 2]
  26. }
  27.  
  28. puts [invokec [test]]
Success #stdin #stdout 0s 15776KB
stdin
Standard input is empty
stdout
1
4
6