Posted to tcl by kbk at Sun Jul 13 19:08:32 GMT 2008view pretty
namespace path {::tcl::mathop ::tcl::unsupported} # Lambda is defined as constructing an invocation of [apply] interp alias {} lambda {} apply {args {list apply $args}} # The I combinator simply returns its argument interp alias {} I {} return -level 0 # The U combinator passes a function as an argument to itself. proc U {f args} {tailcall {*}$f $f {*}$args} # recursive factorial puts [U [lambda {f x} { if {$x == 0} { I 1 } else { * $x [U $f [- $x 1]] } }] 6] # iterative factorial puts [U [lambda {f y x} { if {$x == 0} { I $y } else { tailcall U $f [* $y $x] [- $x 1] } }] 1 6]