以下の例を参考にするとedebug用仕様を理解しやすいでしょう。
スペシャルフォームlet
には束縛と本体の並びがあります。
各束縛は、シンボル、あるいは、シンボルと省略可能な式から成る部分リストです。
以下のedebug用仕様では、部分リストの内側にあるgate
で、
部分リストを一度みつけるとバックトラックを禁止していることに
注意してください。
(def-edebug-spec let ((&rest &or symbolp (gate symbolp &optional form)) body))
edebugは、defun
とdefmacro
、
および、対応する引数リストと仕様interactive
に対しては、
以下のedebug用仕様を使います。
式の引数は実際には関数本体の外側で評価されるので、
対話宣言フォームを特別扱いする必要があります。
(def-edebug-spec defmacro defun) ; 仕様defun
の間接参照 (def-edebug-spec defun (&define name lambda-list [&optional stringp] ; あれば、説明文字列に一致する [&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)) ;def-form
を参照
以下のバッククォートに対する仕様は、
ドット対リストの一致の仕方と再帰を終らせるnil
の使い方を示します。
また、ベクトルの要素の一致の仕方も示します。
(edebugが実際に定義している仕様では、
失敗の可能性がある非常に深い再帰をもたらすためドット対リストを扱わない。)
(def-edebug-spec ` (backquote-form)) ; わかりやすいように別名を付ける
(def-edebug-spec backquote-form
(&or ([&or "," ",@"] &or ("quote" backquote-form) form)
(backquote-form . [&or nil backquote-form])
(vector &rest backquote-form)
sexp))