Posted to tcl by kbk at Wed Jan 15 12:41:01 GMT 2014view pretty
proc fib {x} {
tailcall fibpart1 $x {return -level 0}
}
proc fibpart1 {x cont} {
# evaluates $cont appending [fib $x] as a parameter
if {$x <= 1} {
tailcall {*}$cont 1
} else {
tailcall fibpart1 [expr {$x-1}] [list fibpart2 $x $cont]
}
}
proc fibpart2 {x cont y} {
# now y is [fib {$x-1}]
tailcall fibpart1 [expr {$x-2}] [list fibpart3 $y $cont]
}
proc fibpart3 {y cont z} {
# now z is [fib {$x-2}]
tailcall {*}$cont [expr {$z+$y}]
}
for {set i 0} {$i < 10} {incr i} {
puts [fib $i]
}