Posted to tcl by kbk at Wed Jan 15 12:41:01 GMT 2014view raw

  1. proc fib {x} {
  2. tailcall fibpart1 $x {return -level 0}
  3. }
  4. proc fibpart1 {x cont} {
  5. # evaluates $cont appending [fib $x] as a parameter
  6. if {$x <= 1} {
  7. tailcall {*}$cont 1
  8. } else {
  9. tailcall fibpart1 [expr {$x-1}] [list fibpart2 $x $cont]
  10. }
  11. }
  12. proc fibpart2 {x cont y} {
  13. # now y is [fib {$x-1}]
  14. tailcall fibpart1 [expr {$x-2}] [list fibpart3 $y $cont]
  15. }
  16. proc fibpart3 {y cont z} {
  17. # now z is [fib {$x-2}]
  18. tailcall {*}$cont [expr {$z+$y}]
  19. }
  20. for {set i 0} {$i < 10} {incr i} {
  21. puts [fib $i]
  22. }