次: , 前: Compiling Macros, 上: Macros


12.4 マクロ定義

Lispのマクロは、そのcarmacroであるリストです。 そのcdrは関数であるべきです。 マクロの展開は、マクロ呼び出しの未評価の引数式に (applyで)関数を適用して動作します。

無名関数のように無名Lispマクロを使うことも可能ですが、 けっしてしないでしょう。 mapcarのようなファンクショナルに無名マクロを渡す意味がないからです。 実用上は、すべてのLispマクロには名前があり、 普通、スペシャルフォームdefmacroで定義します。

— 特殊型: defmacro name argument-list body-forms...

defmacroは、シンボルnameをつぎのようなマクロとして定義する。

          (macro lambda argument-list . body-forms)
     

(このリストのcdrは関数、つまり、ラムダ式であることに注意。) このマクロオブジェクトは、nameの関数セルに格納される。 フォームdefmacroを評価した結果、返される値はnameであるが、 通常この値は無視する。

argument-listの形式と意味は、関数のそれと同じであり、 キーワード&rest&optionalを使ってもよい (see Argument List)。 マクロにも説明文字列を指定できるが、 マクロを対話的に呼び出すことはできないので、 interactive宣言は無視する。