GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Instrumenting-Macro-Calls.html ・ emacs-doc.conao3.com

19.2.15.1 マクロ呼び出しのインストルメンテーション

EdebugがLispマクロを呼び出す式にインストルメンテーションを行う際、適切に処理するためにはそのマクロに関する追加情報が必要となります。これは、マクロ呼び出しのどの部分式が評価対象のフォームであるかを、あらかじめ判別する方法がないためです。(評価は、マクロ本体内で明示的に行われる場合もあれば、結果として得られた展開が評価される際、あるいはそれ以降の任意のタイミングで行われる場合もあります。)

したがって、Edebugが遭遇する各マクロについて、そのマクロへの呼び出し形式を説明するEdebug仕様を定義する必要があります。これを行うには、マクロ定義にdebug宣言(declare形式を参照)を追加します。以下に、for例マクロの仕様を示す簡単な例を挙げます(マクロ引数の繰り返し評価を参照)。

(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の仕様では、マクロ呼び出しのどの部分が評価対象のフォームであるかが規定されています。単純なマクロの場合、この仕様はマクロ定義の仮引数リストと非常によく似ていることが多いですが、仕様はマクロの引数よりもはるかに汎用的です。declareフォームの詳細については、declareフォームを参照してください。

コードにインストルメンテーションを施す際は、仕様がEdebugに認識されるよう十分にご注意ください。別のファイルで定義されたマクロを使用する関数にインストルメンテーションを施す場合は、まず関数を含むファイル内のrequire形式を評価するか、あるいはマクロを含むファイルを明示的にロードする必要がある場合があります。マクロの定義がeval-when-compileで囲まれている場合は、それを評価する必要があるかもしれません。

また、def-edebug-spec を使用して、マクロ定義とは別にマクロ用の edebug 仕様を定義することもできます。Lisp のマクロ定義には debug 宣言を追加する方が好ましく、より便利ですが、def-edebug-spec を使用すれば C で実装された特殊フォームに対して Edebug 仕様を定義することが可能です。

マクロ: def-edebug-spec macro specification

マクロ macro の呼び出しにおいて、どの式を評価対象の形式とするかを指定します。specification は Edebug の仕様とする必要があります。いずれの引数も評価されません。

macro 引数には、マクロ名に限らず、実際には任意のシンボルを指定できます。

以下に、specification の取り得るパターンと、それぞれが引数の処理をどのように制御するかをまとめた表を示します。

t

すべての引数は評価用にインストルメントされています。これは (body) の略です。

記号

シンボルにはEdebug仕様が定義されている必要があり、代わりにそれが使用されます。この間接参照は、別の種類の仕様が見つかるまで繰り返されます。これにより、別のマクロから仕様を継承することが可能になります。

リスト

リストの各要素は、呼び出し形式の引数の型を表します。仕様リストに含めることができる要素については、以下のセクションで説明します。

マクロに debug 宣言や def-edebug-spec 呼び出しによる Edebug 指定がない場合、変数 edebug-eval-macro-args が使用されます。

ユーザーオプション: edebug-eval-macro-args

これは、Edebugで明示的に指定されていないマクロ引数の扱いを制御します。値が nil(デフォルト)の場合、どの引数も評価用にインストルメンテーションされません。それ以外の場合は、すべての引数がインストルメンテーションされます。