Это рекурсивное определение макроса делает то, что должно (суммировать целые числа от 1 до n):
(defmacro sum-int-seq (n)
`(cond
((equal 0 ,n) 0)
(t (+ ,n (sum-int-seq (- ,n 1))))))
Например, (sum-int-seq 5)
дает 15.
Но почему это работает? Когда макрос расширяется, я получаю следующее:
(macroexpand '(sum-int-seq 5))
(IF (EQUAL 0 5) 0 (+ 5 (SUM-INT-SEQ (- 5 1))))
Но поскольку sum-int-seq является макросом, вычисление макроса должно стать бесконечным циклом. Создает ли компилятор вместо этого рекурсивную функцию? Если это определение создает рекурсивную функцию, есть ли какие-либо способ рекурсивно определять макросы?
(Это глупый пример для краткости, функция, конечно, подойдет для этого лучше)