Spec-Zone.ru › Elisp

Инструментирование вызовов макросов

Когда Edebug инструментирует выражение, вызывающее макрос Lisp, для правильной работы ему нужны дополнительные сведения о макросе. Это связано с тем, что заранее невозможно определить, какие подвыражения вызова макроса являются формами, подлежащими вычислению. (Вычисление может происходить явно в теле макроса, при вычислении полученного раскрытия или в любой последующий момент.)

Поэтому для каждого макроса, с которым встретится Edebug, необходимо определить спецификацию Edebug, описывающую формат вызовов этого макроса. Для этого добавьте объявление debug в определение макроса (см. Форма declare). Вот простой пример, показывающий спецификацию для макроса for из примера (см. Повторное вычисление аргументов макроса).

(defmacro for (var from init to final do &rest body)
  "Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
  (declare (debug (symbolp "from" form "to" form "do" &rest form)))
  ...)

Спецификация Edebug указывает, какие части вызова макроса являются формами, подлежащими вычислению. Для простых макросов спецификация часто очень похожа на список формальных аргументов определения макроса, но спецификации гораздо универсальнее аргументов макроса. Подробнее о форме declare см. в разделе Форма declare.

Позаботьтесь о том, чтобы спецификации были известны Edebug при инструментировании кода. Если вы инструментируете функцию, использующую макрос, определённый в другом файле, возможно, сначала потребуется вычислить формы require в файле с вашей функцией или явно загрузить файл с макросом. Если определение макроса заключено в eval-when-compile, возможно, потребуется его вычислить.

Также можно определить спецификацию Edebug для макроса отдельно от его определения с помощью def-edebug-spec. Для определений макросов на Lisp предпочтительнее и удобнее добавлять объявления debug, однако def-edebug-spec позволяет определять спецификации Edebug для специальных форм, реализованных на C.

Макрос: def-edebug-spec macro specification

Указывает, какие выражения вызова макроса macro являются формами, подлежащими вычислению. specification должна быть спецификацией Edebug. Ни один из аргументов не вычисляется.

Аргумент macro на самом деле может быть любым символом, а не только именем макроса.

Ниже приведена таблица возможных значений specification и того, как каждое из них определяет обработку аргументов.

t

Все аргументы инструментируются для вычисления. Это краткая запись для (body).

символ

У символа должна быть спецификация Edebug, которая используется вместо него. Эта цепочка косвенных ссылок продолжается, пока не будет найден другой тип спецификации. Это позволяет наследовать спецификацию от другого макроса.

список

Элементы списка описывают типы аргументов вызываемой формы. Возможные элементы списка спецификации описаны в следующих разделах.

Если у макроса нет спецификации Edebug — ни через объявление debug, ни через вызов def-edebug-spec, — вступает в действие переменная edebug-eval-macro-args.

Пользовательский параметр: edebug-eval-macro-args

Определяет, как Edebug обрабатывает аргументы макросов, для которых не задана явная спецификация Edebug. Если значение равно nil (по умолчанию), ни один из аргументов не инструментируется для вычисления. В противном случае инструментируются все аргументы.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Instrumenting-Macro-Calls.html

Spec-Zone.ru

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