Specification Examples
......................
It may be easier to understand Edebug specifications by studying the
examples provided here.
A `let' special form has a sequence of bindings and a body. Each of
the bindings is either a symbol or a sublist with a symbol and optional
expression. In the specification below, notice the `gate' inside of
the sublist to prevent backtracking once a sublist is found.
(def-edebug-spec let
((&rest
&or symbolp (gate symbolp &optional form))
body))
Edebug uses the following specifications for `defun' and `defmacro'
and the associated argument list and `interactive' specifications. It
is necessary to handle interactive forms specially since an expression
argument it is actually evaluated outside of the function body.
(def-edebug-spec defmacro defun) ; Indirect ref to `defun' spec.
(def-edebug-spec defun
(&define name lambda-list
[&optional stringp] ; Match the doc string, if present.
[&optional ("interactive" interactive)]
def-body))
(def-edebug-spec lambda-list
(([&rest arg]
[&optional ["&optional" arg &rest arg]]
&optional ["&rest" arg]
)))
(def-edebug-spec interactive
(&optional &or stringp def-form)) ; Notice: `def-form'
The specification for backquote below illustrates how to match
dotted lists and use `nil' to terminate recursion. It also illustrates
how components of a vector may be matched. (The actual specification
defined by Edebug does not support dotted lists because doing so causes
very deep recursion that could fail.)
(def-edebug-spec ` (backquote-form)) ; Alias just for clarity.
(def-edebug-spec backquote-form
(&or ([&or "," ",@"] &or ("quote" backquote-form) form)
(backquote-form . [&or nil backquote-form])
(vector &rest backquote-form)
sexp))