[REBOL] Re: Stack depth & Recursion
From: deadzaphod:flyingparty at: 10-Jul-2001 0:32
> Here's a little test func to find stack depth
> via recursion.
> >> recfun: func [x][prin [x #" "] x: x + 1 recfun x]
> >> recfun 1
> 1 2 . . . 3146 3147 ERROR!
> ** Internal Error: Stack overflow
> ** Near: x #" "
> I've got REBOL/Core 2.5 and it always seem to halt
> at 3148 stack depth.
Funny, right now I'm at around 300000 and still running... ;-)
After seeing this discussion I wrote a little hack to implement tail
recursion elimination. I'm sure it could be done better (Joel? Ladislav?
anybody wanna fix this thing up?) but works well enough that I'll probably
use it the next time I need deep recursion.
(wow.. up to 452000 already) anyway, here it is, enjoy!
REBOL [ Title: "Tail recursion eliminator" ]
tail-func: func [
"Defines a function that uses tail-recursion"
word [word!] "The function name" args [block!] locals [block!] body
set word function args append locals [
tailfunc args tailfunc-context return-value code-block
] append reduce [
; initialize locals here
to-set-word 'tailfunc-context context reduce [
to-set-word word 'function args  [ throw/name bind args 'local
to-set-word 'args 'bind copy args to-lit-word 'local
to-set-word 'tailfunc 'function args locals 'bind copy body 'in
; the code that really does the work
bind args 'local
code-block: head insert tail copy [return-value: tailfunc ] reduce
set args catch/name code-block 'tf
function args locals body
; >> tail-func 'recfun [x]  [prin [x #" "] x: x + 1 recfun x]
;>> recfun 1
; now watch it run ;-)