Когда Edebug инструментализирует выражение, вызывающее макрос Lisp, ему требуется дополнительная информация о макросе, чтобы выполнить работу должным образом. Это связано с тем, что изначально нет способа определить, какие подвыражения вызова макроса являются формами, подлежащими вычислению. (Вычисление может произойти явно в теле макроса, или когда вычисляется полученное расширение, или в любой другой момент.)
Поэтому вы должны определить спецификацию Edebug для каждого макроса, с которым столкнется Edebug, чтобы объяснить формат вызовов этого макроса. Для этого добавьте объявление debug в определение макроса. Вот простой пример, показывающий спецификацию для примера макроса for (см. Повторное вычисление аргументов макроса).
(defmacro for (var from init to final do &rest body) "Выполняет простой цикл "for". Например, (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.
Укажите, какие выражения вызова макроса macro являются формами, подлежащими вычислению. specification должна быть спецификацией Edebug. Ни один из аргументов не вычисляется.
Аргумент macro на самом деле может быть любым символом, а не только именем макроса.
Вот таблица возможностей для specification и то, как каждая из них управляет обработкой аргументов.
tВсе аргументы инструментализируются для вычисления. Это сокращение от (body).
Символ должен иметь спецификацию Edebug, которая используется вместо этого. Эта косвенность повторяется до тех пор, пока не будет найдена другая спецификация. Это позволяет вам наследовать спецификацию от другого макроса.
Элементы списка описывают типы аргументов вызывающей формы. Возможные элементы списка спецификации описаны в следующих разделах.
Если у макроса нет спецификации Edebug, ни через объявление debug, ни через вызов def-edebug-spec, в дело вступает переменная edebug-eval-macro-args.
Это контролирует, как Edebug обрабатывает аргументы макроса без явной спецификации Edebug. Если она равна nil (по умолчанию), ни один из аргументов не инструментализируется для вычисления. В противном случае все аргументы инструментализируются.