Объект макроса Lisp — это список, чей CAR равен macro, а
чей CDR является функцией. Раскрытие макроса работает
путём применения функции (с помощью apply) к списку
невычисленных аргументов из вызова макроса.
Можно использовать анонимный макрос Lisp так же, как анонимную
функцию, но этого никогда не делается, поскольку передавать
анонимный макрос функционалам вроде mapcar не имеет смысла. На
практике все макросы Lisp имеют имена, и они почти всегда
определяются с помощью макроса defmacro.
defmacro определяет символ имя (который не должен быть
заключён в кавычки) как макрос, который выглядит так:
(macro lambda аргументы . тело)
(Заметьте, что CDR этого списка является лямбда-выражением.) Этот
объект макроса сохраняется в функциональной ячейке имени.
Смысл аргументов такой же, как в функции, и могут
использоваться ключевые слова &rest и &optional (см. Особенности списков аргументов).
Ни имя, ни аргументы не должны заключаться в кавычки. Возвращаемое
значение defmacro не определено.
док, если присутствует, должна быть строкой, задающей строку
документации макроса. declare, если присутствует, должна быть
формой declare, задающей метаданные для макроса (см. Форма declare). Обратите внимание, что макросы не могут иметь интерактивных объявлений,
поскольку их нельзя вызывать интерактивно.
Макросам часто требуется конструировать большие списковые структуры из смеси константных и неконстантных частей. Чтобы упростить это, используйте синтаксис ‘`’ (см. Обратная кавычка). Например:
(defmacro t-becomes-nil (variable)
`(if (eq ,variable t)
(setq ,variable nil)))
(t-becomes-nil foo)
≡ (if (eq foo t) (setq foo nil))