Posted to tcl by kbk at Wed Jan 15 12:41:01 GMT 2014view raw
- 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]
- }