19.2.15.4 Примеры спецификаций

Может быть проще понять спецификации 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))