Spec-Zone.ru › Elisp

Оценивание макросов Lisp

Если первый элемент списка, который оценивается, является объектом макроса, то список является вызовом макроса. При оценке вызова макроса элементы остальной части списка не оцениваются первоначально. Вместо этого эти элементы сами используются в качестве аргументов макроса. Определение макроса вычисляет форму замены, называемую расширением макроса, которая должна оцениваться вместо исходной формы. Расширение может быть любой формой: самооцениваемой константой, символом или списком. Если расширение само является вызовом макроса, этот процесс расширения повторяется до тех пор, пока не получится какая-либо другая форма.

Обычная оценка вызова макроса завершается оценкой расширения. Однако расширение макроса не обязательно оценивается сразу или вообще, потому что другие программы также расширяют вызовы макросов, и они могут или не могут оценивать расширения.

Обычно выражения аргументов не оцениваются в рамках вычисления расширения макроса, а вместо этого появляются в качестве части расширения, поэтому они вычисляются при оценке расширения.

Например, при заданном определении макроса следующим образом:

(defmacro cadr (x)
  (list 'car (list 'cdr x)))

выражение, такое как (cadr (assq 'handler list)) является вызовом макроса, и его расширение:

(car (cdr (assq 'handler list)))

Обратите внимание, что аргумент (assq 'handler list) появляется в расширении.

См. Макросы для полного описания макросов Emacs Lisp.

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/Macro-Forms.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API