Previous: Backtracking, Up: Instrumenting Macro Calls


17.2.15.3 仕様の例

以下の例を参考にするとedebug用仕様を理解しやすいでしょう。

スペシャルフォームletには束縛と本体の並びがあります。 各束縛は、シンボル、あるいは、シンボルと省略可能な式から成る部分リストです。 以下のedebug用仕様では、部分リストの内側にあるgateで、 部分リストを一度みつけるとバックトラックを禁止していることに 注意してください。

     (def-edebug-spec let
       ((&rest
         &or symbolp (gate symbolp &optional form))
        body))

edebugは、defundefmacro、 および、対応する引数リストと仕様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))