Определение макросов
Объект макроса Lisp представляет собой список, у которого CAR — это macro, а CDR — это функция. Расширение макроса происходит путём применения функции (с apply) к списку невычисленных аргументов из вызова макроса.
Можно использовать анонимный макрос Lisp, как и анонимную функцию, но этого никогда не делают, потому что нет смысла передавать анонимный макрос функционалам, таким как mapcar. На практике все макросы Lisp имеют имена, и они почти всегда определяются с помощью макроса defmacro.
- Макрос: defmacro имя аргументы [документация] [объявление] тело…
-
defmacroопределяет символ имя (который не должен быть процитирован) как макрос, который выглядит так:(macro lambda args . body)
(Обратите внимание, что CDR этого списка — это выражение лямбда.) Этот объект макроса хранится в ячейке функции имя. Значение аргументы такое же, как и в функции, и могут использоваться ключевые слова
&restи&optional(см. Список аргументов). Ни имя, ни аргументы не должны быть процитированы. Значение возвратаdefmacroне определено.документация, если указана, должна быть строкой, задающей строку документации макроса. объявление, если указано, должно быть формой
declareс указанием метаданных для макроса (см. Форму объявления). Обратите внимание, что макросы не могут иметь интерактивные объявления, так как они не могут быть вызваны интерактивно.
Макросы часто нуждаются в построении больших структур списков из смеси констант и переменных частей. Чтобы упростить эту задачу, используйте синтаксис ‘`’ (см. Обратный апостроф). Например:
(defmacro t-becomes-nil (variable)
`(if (eq ,variable t)
(setq ,variable nil)))
(t-becomes-nil foo)
≡ (if (eq foo t) (setq foo nil))
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Macros.html