Может быть проще понять спецификации Edebug, изучив приведенные здесь примеры.
Рассмотрим гипотетический макрос my-test-generator, который выполняет
тесты для предоставленных списков данных. Хотя по умолчанию в Edebug
не производится инструментация аргументов как кода, что контролируется
edebug-eval-macro-args (см. Инструментация вызовов макросов),
полезно явно задокументировать, что аргументы являются данными:
(def-edebug-spec my-test-generator (&rest sexp))
Специальная форма let имеет последовательность привязок и тело. Каждая
привязка является либо символом, либо подсписком с символом и
необязательным выражением. В приведенной ниже спецификации обратите внимание на gate
внутри подсписка, чтобы предотвратить обратное отслеживание после нахождения подсписка.
(def-edebug-spec let
((&rest
&or symbolp (gate symbolp &optional form))
body))
Edebug использует следующие спецификации для defun и
соответствующего списка аргументов, а также спецификации interactive.
Необходимо специально обрабатывать интерактивные формы, поскольку аргумент-выражение
фактически вычисляется вне тела функции. (Спецификация для defmacro
очень похожа на спецификацию для defun, но допускает использование
оператора declare.)
(def-edebug-spec defun
(&define name lambda-list
[&optional stringp] ; Сопоставляет строку документации, если она есть.
[&optional ("interactive" interactive)]
def-body))
(def-edebug-elem-spec 'lambda-list
'(([&rest arg]
[&optional ["&optional" arg &rest arg]]
&optional ["&rest" arg]
)))
(def-edebug-elem-spec 'interactive
'(&optional &or stringp def-form)) ; Обратите внимание: def-form
Спецификация для обратных кавычек (backquote) ниже иллюстрирует, как
сопоставлять пунктирные списки и использовать nil для завершения рекурсии.
Она также демонстрирует, как могут сопоставляться компоненты вектора. (Фактическая
спецификация, определенная Edebug, немного отличается и не поддерживает пунктирные
списки, поскольку это вызывает очень глубокую рекурсию, которая может завершиться неудачей.)
(def-edebug-spec \` (backquote-form)) ; Псевдоним только для ясности.
(def-edebug-elem-spec 'backquote-form
'(&or ([&or "," ",@"] &or ("quote" backquote-form) form)
(backquote-form . [&or nil backquote-form])
(vector &rest backquote-form)
sexp))