Next: , Up: Edebug and Macros   [Contents][Index]


17.2.15.1 Instrumenting Macro Calls

EdebugがLispマクロを呼び出す式をインストルメントするときは、正しくインストルメントを行なうために、そのマクロに関して追加の情報が必要になります。これは、マクロ呼び出しのどの部分式(subexpression)が評価されるフォームなのか推測する方法がないからです。(評価はマクロのbodyで明示的に発生するかもしれないし、展開結果が評価されるとき、または任意のタイミングで行われるかもしれません。)

したがって、Edebugが処理するかもしれないすべてのマクロにたいして、そのマクロの呼び出しフォーマットを説明するための、Edebug仕様(Edebug specification)を定義しなければなりません。これを行なうには、マクロ定義にdebug宣言を追加します。以下はマクロ例for(Argument Evaluationを参照)にたいする簡単な仕様の例です。

(defmacro for (var from init to final do &rest body)
  "Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
  (declare (debug (symbolp "from" form "to" form "do" &rest form)))
  ...)

このEdebug仕様は、マクロ呼び出しのどの部分が評価されるフォームなのかを示しています。単純なマクロにたいするEdebug仕様は、そのマクロ定義の正式な引数リストに非常に類似している場合がありますが、Edebug仕様はマクロ引数に比べより汎的です。declareフォームの詳細は、Defining Macrosを参照してください。

コードをインストルメントするときEdebugに仕様が確実に解るよう注意してください。マクロ定義を含む他のファイルを要求するためにeval-when-compileを使用するファイルから関数をインストルメントする場合は、そのファイルを明示的にロードする必要があるかもしれません。

def-edebug-specによりマクロ定義から個々のマクロにたいしてEdebug仕様を定義することもできます。Lispで記述されたマクロ定義にたいしてはdebug宣言を追加するほうが好ましく、その方が便利でもありますが、def-edebug-specではCで実装されたスペシャルフォームにたいしてEdebug仕様を定義することが可能になります。

Macro: def-edebug-spec macro specification

マクロmacro呼び出しのどの式が評価される式かを指定する。specificationはEdebug仕様である。どちらの引数も評価されない。

引数macroは単なるマクロ名ではない、任意の実シンボルを指定できる。

以下はspecificationに指定できるシンボルと、引数を処理する方法のテーブルです。

t

すべての引数は評価のためにインストルメントされる。

0

引数はインストルメントされない。

シンボル

そのシンボルは、かわりに使用されるEdebug仕様をもたなければならない。このインダイレクションは、他の種類の仕様が見つかるまで繰り返される。これにより、他のマクロの仕様を継承できる。

リスト

リストの要素はフォーム呼び出しの引数の型を記述する。仕様リストに指定できる要素については、以降のセクションを参照。

マクロがEdebug仕様をもたない場合は、debug宣言およびdef-edebug-spec呼び出しのどちらを通じても、変数edebug-eval-macro-argsが効果を発揮する。

User Option: edebug-eval-macro-args

これは、Edebugが明示的なEdebug仕様をもたないマクロ引数を扱う方法を制御する。nil(デフォルト)の場合、引数は評価のためにインストルメントされない。それ以外は、すべての引数がインストルメントされる。