Как вычисляются рекурсивные определения макросов

Это рекурсивное определение макроса делает то, что должно (суммировать целые числа от 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 является макросом, вычисление макроса должно стать бесконечным циклом. Создает ли компилятор вместо этого рекурсивную функцию? Если это определение создает рекурсивную функцию, есть ли какие-либо способ рекурсивно определять макросы?

(Это глупый пример для краткости, функция, конечно, подойдет для этого лучше)

9
задан snowape 22 November 2011 в 21:05
поделиться