Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I guess I'm not understanding the problem then, because I thought we were not supposed to expand into a do, since the problem states:

"Define ntimes (page 167) to expand into a (local) recursive function instead of a do."

Isn't the problem asking you to write this without expanding into a do, or am I missing something here? What would be a correct solution to the problem?



Oops, didn't read the problem. Yes, as other commenters say, you should expand into a call to a recursive function, not an expression that gets expanded recursively.

If you were writing this for real you'd expand into a do, so this problem is somewhat artificially difficult.


> Oops, didn't read the problem.

You wrote the problem. ;)


Thanks, I figured it out now.


My Lisp-fu is lower than the expected for this exercice. But it seems that you have to create a recursive function not a recursive macro, which is what you are doing.

Maybe the macro has to define a new recursive function that recurses until need, and then call it?


Yes, I believe local functions are usually defined with flet.


I'm not sure, but I think you need to use labels, rather than flet, in this case, since local functions defined using flet cannot be recursive. At least that's how I interpret what it says on page 319.

At any rate, this solution works using labels:

  (defmacro ntimes (n &rest body)
      (let ((h (gensym))
            (g (gensym)))
        `(let ((,h ,n))
           (labels ((ntimes-local (,g) 
                    (if (> ,g 0) 
                        ,@body)
                    (if (zerop ,g)
                        nil
                        (ntimes-local (1- ,g)))))
             (ntimes-local ,h)))))
(Sorry, but again I don't know how to preserve the formatting of my code in this newsgroup.)





Consider applying for YC's Fall 2025 batch! Applications are open till Aug 4

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: