> Apparently clisp does do some tail call optimization, but I can't figure what it'd be used for other than an non-terminating loop such as a REPL, if it doesn't even handle this simple case properly.)
You simply forgot to compile the code!
[1]> (defun f (n) (if (<= n 0) n (f (- n 1))))
F
[2]> (compile 'f)
F ;
NIL ;
NIL
[3]> (f 1000000)
0
The limited form of tail call in CLISP is a feature of its compiler only, not of the interpreter.
SBCL compiles everything, so there is no need.
But SBCL requires an existing Common Lisp installation for bootstrapping, whereas CLISP bootstraps itself just from C thanks to its interpreter.
You simply forgot to compile the code!
The limited form of tail call in CLISP is a feature of its compiler only, not of the interpreter.SBCL compiles everything, so there is no need.
But SBCL requires an existing Common Lisp installation for bootstrapping, whereas CLISP bootstraps itself just from C thanks to its interpreter.