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]
}