Posted to tcl by kbk at Mon Nov 02 18:06:22 GMT 2009view pretty
namespace path {::tcl::mathop ::tcl::unsupported}
puts [apply {f {list apply $f $f}} {f {list apply $f $f}}]
# 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 x {y 1}} {
if {$x == 0} {
I $y
} else {
tailcall U $f [- $x 1] [* $y $x]
}
}] 6]
# fold a lambda!
puts [U [lambda {foldl base op list} {
if {[llength $list] == 0} {
I $base
} else {
tailcall U $foldl \
[{*}$op $base [lindex $list 0]] \
$op \
[lrange $list 1 end]
}
}] \
{0 1} \
[lambda {p q} {
list [+ [lindex $p 0] $q] \
[* [lindex $p 1] $q]}] \
{1 2 3 4 5}]
# fold - left associative
proc foldl {base op list} {
if {[llength $list] == 0} {
I $base
} else {
tailcall foldl [{*}$op $base [lindex $list 0]] $op [lrange $list 1 end]
}
}
puts [foldl 0 + {1 2 3 4 5}]
puts [foldl 0 [lambda {x y} {+ $x $y}] {1 2 3 4 5}]
proc fact3 {n c} {
if {$n == 0} {
{*}$c 1
} else {
tailcall fact3 [- $n 1] \
[list apply {{n c f} {
puts [list continuation $c will get the product of $n and $f]
{*}$c [* $n $f]
}} $n $c]
}
}
fact3 6 puts