以下で提供する例から学ぶことにより、Edebug仕様の理解が容易になるでしょう。
与えられたデータりすとにテストを実行する架空nマクロmy-test-generator
を考えてみましょう。edebug-eval-macro-args
(マクロ呼び出しのインストルメントを参照)によって制御されるようにEdebugのデフォルトの振る舞いでは引数をコードとしてインストルメントしませんが、引数がデータであることをドキュメントするのは役に立つかもしれません。
(def-edebug-spec my-test-generator (&rest sexp))
スペシャルフォームlet
は、バインディングとbodyのシーケンスをもちます。各バインディングはそシンボル、またはシンボルとオプションの部分リストです。以下の仕様では部分リストを見つけたらバックトラックを抑止するために、部分リスト内のgate
があることに注目してください。
(def-edebug-spec let ((&rest &or symbolp (gate symbolp &optional form)) body))
Edebugはdefun
および関連する引数リスト、interactive
仕様にたいして以下の仕様を使用します。式の引数はその関数bodyの外部で実際に評価されるので、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
に注目
以下のバッククォートにたいする仕様はドットリストにマッチさせる方法と、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))