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

  1. proc fib {x} {
  2. tailcall fibcps $x {{x} {return $x}}
  3. }
  4. proc fibcps {x cont} {
  5. if {$x <= 1} {
  6. tailcall apply $cont 1
  7. } else {
  8. tailcall fibcps [expr {$x-1}] \
  9. [list [list y [list x $x] [list cont $cont]] {
  10. tailcall fibcps [expr {$x-2}] \
  11. [list [list z [list y $y] [list cont $cont]] {
  12. tailcall apply $cont [expr {$y+$z}]
  13. }]
  14. }]
  15. }
  16. }
  17. for {set i 0} {$i < 10} {incr i} {
  18. puts [fib $i]
  19. }

Comments

Posted by kbk at Wed Jan 15 12:39:52 GMT 2014 [text] [code]

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