Hi, [EMAIL PROTECTED] writes:
> I'm a little confused. The Wikipedia entry on guile has a vague statement > about > how guile can't do tail call optimization in functions that use C > code. First, we have to differentiate between tail call and _recursive tail call---one usually cares more about the latter. Recursive tail calls are always optimized in Scheme code, as mandated by R5RS (Section 3.5). For example: (let loop ((x 10)) (if (<= x 0) #t (loop (1+ x)))) Guile optimizes the tail-recursive call to `loop', so iterations of the above loop do not consume any additional stack space. Now, non-recursive tail calls certainly be optimized when the called function is implemented in C. For instance: (define (foo x) (1+ x)) Here, `1+' is implemented in C, so the call to `1+' is not tail-optimized (i.e., it consumes additional stack space). Hmm, actually, if the C compiler used to compile Guile implements tail-call optimization, then even such code might be tail-optimized. I'm not sure whether tail calls to Scheme-implemented procedures are optimized. Anyway, the important point is that Guile does optimize tail-recursive calls, fortunately. > Wikipedia also says that guile has difficulties with call/cc, and I assume > this > is a similar issue, calling a continuation that was captured in scheme code > that was called from a different C function than the currently running scheme > code. Right? (confusing sentence, I know!) AFAIK `call/cc' works "as expected" in Guile. The only problem is that it is inefficient because the whole call stack has to be copied, as mentioned in the manual. Thanks, Ludovic. _______________________________________________ Guile-user mailing list Guile-user@gnu.org http://lists.gnu.org/mailman/listinfo/guile-user