ここで挙げられている例を調べることで、Edebugの仕様をより理解しやすくなるかもしれません。
提供されたデータリストに対してテストを実行する、仮想的なマクロ my-test-generator
を考えてみましょう。edebug-eval-macro-args で制御される通り(マクロ呼び出しのインストルメンテーション
を参照)、引数をコードとしてインストルメントしないのが Edebug
のデフォルト動作ですが、引数がデータであることを明示的に記述しておくと有用な場合があります:
(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
以下のバッククォートの仕様では、ドット付きリストのマッチング方法と、再帰を終了させるための 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))