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]