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)))))