gugamilare  <gugamilare@gmail.com> wrote:
+---------------
| chthon <jurgen.defu...@pandora.be> wrote:
| > If I program in Scheme then it is almost natural to use tail
| > recursion, while in Common Lisp, generally that can not be the case,
| > since this is implementation dependent. So I use LOOP fairly often.
| 
| People keep saying that tail recursion in CL is implementation
| dependent, but the only implementation that I tested that doesn't have
| tail call optimization is ECL, and I expect that to be changed. Even
| Clisp, which is not optimized, has this optimization if you compile
| the function.
+---------------
Careful! What you say is true *only* in the absence of live bindings
for dynamic variables or live dynamic contexts such as UNWIND-PROTECT,
WITHOUT-ERRORS, HANDLER-BIND, HANDLER-CASE, CATCH, etc., etc., etc.
Even CL implementations which routinely do TCO for "simple" tail calls
generally cannot do TCO across such contours!! Note that the non-TCO'able
case could be as simple as this:
    > (defun foo (*standard-output*)
        (format t "This was *not* a tail call of FORMAT!!"))
    FOO
    > (with-output-to-string (s)
	(foo s))
    "This was *not* a tail call of FORMAT!!"
    > 
-Rob
-----
Rob Warnock			<rpw3@rpw3.org>
627 26th Avenue			<URL:http://rpw3.org/>
San Mateo, CA 94403		(650)572-2607