I came up with the following solution for Exercise 4 in Chapter 10 of "ANSI Common Lisp" by Paul Graham:<p><pre><code> (defmacro ntimes (n &rest body)
(let ((h (gensym)))
`(let ((,h ,n))
(if (> ,h 0)
,@body)
(if (zerop ,h)
nil
(ntimes (1- ,h) ,@body)))))
</code></pre>
Using GNU CLISP 2.44, this works fine. However, when I use SBCL 1.0.6 via Cusp v0.8.174 and do the following call:<p><pre><code> (ntimes 10
(princ "."))
</code></pre>
I get the following error:<p>Control stack exhausted (no more space for function call frames). This is probably due to heavily nested or infinitely recursive function calls, or a tail call that SBCL cannot or has not optimized away.<p>What exactly is going on here? Is my solution correct and SBCL is wrong, or is my solution incorrect but it just happens to work on CLISP?
You've written a recursive macro. That is usually a mistake. Here (unless you mean the first argument always to be a constant) you're recursing based on values that won't be available till runtime, yet the macro could be expanded at compile-time.<p>You should just expand into a do.
Sorry about the non-pretty printing. It was nicely formatted, when I entered it (I swear). Is there something like a <code> tag I could use?<p>Also, not all of the error message printed. What's up with that?