Previous: Backtracking, Up: Edebug and Macros [Contents][Index]
以下で提供する例から学ぶことにより、Edebug仕様の理解が容易になるかもしれません。
スペシャルフォーム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-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
以下のバッククォートにたいする仕様は、ドットリストにマッチさせる方法と、nil
を使用して再帰を終了させる方法を説明するための例です。また、ベクターのコンポーネントをマッチさせる方法も示しています。(Edebugにより定義される実際の仕様は少し異なり、ドットリストについては失敗するかもしれない非常に深い再帰を引き起こすためサポートしていません。)
(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))