Posted to tcl by kbk at Tue Jul 28 20:55:49 GMT 2015view pretty

proc gensym {} {
    variable i
    return \#g[incr i]
}
proc makeProc {a} {
    set p [gensym]
    set v [gensym]
    set vfull [namespace current]::storage::$v
    namespace eval [namespace current]::storage [list variable $v 0]
    proc $p [list b [list a $a]] \
	[string map [list @v $vfull] {
	    expr {$a * [incr @v] * $b}
	}]
    return $p
}
set fred [makeProc 2]
puts [$fred 3]
puts [$fred 5]
puts [$fred 5]