Next: , Previous: , Up: Macros   [Contents][Index]


13.4 Defining Macros

Lispのマクロオブジェクトは、CARmacroで、CDRが関数のリストです。マクロの展開形は、マクロ呼び出しから、評価されていない引数のリストに、(applyを使って)関数を適用することにより機能します。

無名関数のように無名Lispマクロを使用することも可能ですが、無名マクロをmapcarのようなファンクショナルに渡すことに意味がないので、これが行われることはありません。実際のところ、すべてのLispマクロは名前をもち、ほとんど常にdefmacroマクロで定義されます。

Macro: defmacro name args [doc] [declare] body…

defmacroはシンボルname(クォートはしない)を、以下のようなマクロ押して定義します:

(macro lambda args . body)

(このリストのCDRはラムダ式であることに注意してください。) このマクロオブジェクトは、nameの関数セルに格納されます。argsの意味は関数の場合と同じで、キーワード&restおよび&optionalが使用されることもあります(Argument Listを参照してください)。nameargsはどちらも、クォートされるべきではありません。defmacroのreturn値は未定義です。

docが与えられた場合、それはマクロのドキュメント文字列を指定する文字列です。declareが与えられた場合、それはマクロのメタデータを指定するdeclareフォームです(Declare Formを参照してください)。マクロを対話的に呼び出すことはできないので、インタラクティブ宣言をもつことはできないことに注意してください。

マクロが、定数部と非定数部の混合体から構築される巨大なリスト構造を必要とする場合があります。これを簡単に行うためには、‘`’構文(Backquoteを参照してください)を使用します。たとえば:

(defmacro t-becomes-nil (variable)
  `(if (eq ,variable t)
       (setq ,variable nil)))

(t-becomes-nil foo)
     ≡ (if (eq foo t) (setq foo nil))

マクロ定義のbodyには、そのマクロに関する追加のプロパティーを指定する、declareフォームを含めることができます。Declare Formを参照してください。