Spec-Zone.ru › Elisp

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

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

Поэтому вы должны определить спецификацию Edebug для каждого макроса, с которым столкнётся Edebug, чтобы объяснить формат вызовов этого макроса. Для этого добавьте объявление debug в определение макроса. Вот простой пример, который демонстрирует спецификацию для макроса 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.

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

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

Макрос: def-edebug-spec спецификация макроса

Укажите, какие выражения вызова макроса 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-2022 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