proc closure {env params body} {
set ns [uplevel 1 { namespace current }]
set body [list with __scope__ $body]
set lambda [list $params $body $ns]
return [list $env $lambda]
}
proc with {scopeVar body} {
uplevel 1 [list upvar 1 $scopeVar __scope__]
uplevel 1 [list dict with __scope__ $body]
}
proc applyc {closureVar args} {
upvar 1 $closureVar closure
lassign $closure __scope__ lambda
try { apply $lambda {*}$args } on ok result { set closure [list $__scope__ $lambda]; return $result }
}
proc invokec {args} {
uplevel 1 {*}$args
}
set counter [closure {i 0} {{n 1}} { incr i $n }]
puts "MAIN: [applyc counter]"
puts "MAIN: [applyc counter]"
proc test {localcounter} {
puts "TEST: [applyc localcounter]"
puts "TEST: [applyc localcounter]"
}
test $counter
puts "MAIN: [applyc counter]"