Spec-Zone.ru › Elisp

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

Примеры, представленные здесь, могут помочь в понимании спецификаций 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]   ; Match the doc string, if present.
           [&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))    ; Notice: def-form

Спецификация для backquote ниже иллюстрирует, как сопоставлять списки с точкой и использовать nil для завершения рекурсии. Она также демонстрирует, как можно сопоставить компоненты вектора. (Фактическая спецификация, определённая Edebug, немного отличается и не поддерживает списки с точкой, так как это приводит к очень глубокой рекурсии, которая может завершиться сбоем).

(def-edebug-spec \` (backquote-form))   ; Alias just for clarity.

(def-edebug-elem-spec 'backquote-form
  '(&or ([&or "," ",@"] &or ("quote" backquote-form) form)
        (backquote-form . [&or nil backquote-form])
        (vector &rest backquote-form)
        sexp))

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/Specification-Examples.html

Spec-Zone.ru

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