LINUX.ORG.RU

История изменений

Исправление theNamelessOne, (текущая версия) :

Рекурсивный?

Не, через do, например:

(defmacro while (condition &body body)
  `(do ()
       ((not ,condition))
     ,@body))
     
(let ((counter 10))
  (while (not (zerop counter))
    (format t "tick ~a...~%" counter)
    (decf counter))
  (format t "BOOM!~%"))

при попытке выполнения выдаёт переполнение стека

Потому что происходит бесконечное раскрытие рекурсивного макроса.

Исходная версия theNamelessOne, :

Рекурсивный?

Не, через do, например:

(defmacro while (condition &body body)
  `(do ()
       ((not ,condition))
     ,@body))
     
(let ((counter 10))
  (while (not (zerop counter))
    (format t "tick ~a...~%" counter)
    (decf counter))
  (format t "BOOM!~%"))

при попытке выполнения выдаёт переполнение стека

Потому что происходит бесконечное раскрытие рекурсивного макроса.