Макрос - это функция, которая обычно вызывается автоматически во время компиляции или вычисления, и ее возвращаемое значение затем компилируется или вычисляется вместо исходного выражения.
Но поскольку это просто функция, ничто не мешает ее явному вызову также во время выполнения, и это то, что MACROEXPAND
и MACROEXPAND-1
делают.
Это примерно эквивалентно:
(defun macroexpand-1 (form &optional env)
(if (and (listp form) (car form)) ;; list expression
(let ((macfun (macro-function (car form)))
(if macfun
(funcall macfun form env)
form))
form))
(Обратите внимание, что это определение не обрабатывает макросы символов и не использует *MACROEXPAND-HOOK*
, чтобы упростить его.)
Можно использовать EVAL-WHEN
при определении макроса, чтобы сделать определение макроса доступным только в среде компиляции. Если вы сделаете это, попытка расширения во время выполнения завершится неудачей.