Next: Problems with Macros, Previous: Compiling Macros, Up: Macros [Contents][Index]
Lispのマクロオブジェクトは、CARがmacro
で、CDRが関数のリストです。マクロの展開形は、マクロ呼び出しから、評価されていない引数のリストに、(apply
を使って)関数を適用することにより機能します。
無名関数のように無名Lispマクロを使用することも可能ですが、無名マクロをmapcar
のようなファンクショナルに渡すことに意味がないので、これが行われることはありません。実際のところ、すべてのLispマクロは名前をもち、ほとんど常にdefmacro
マクロで定義されます。
defmacro
はシンボルname(クォートはしない)を、以下のようなマクロ押して定義します:
(macro lambda args . body)
(このリストのCDRはラムダ式であることに注意してください。)
このマクロオブジェクトは、nameの関数セルに格納されます。argsの意味は関数の場合と同じで、キーワード&rest
および&optional
が使用されることもあります(Argument Listを参照してください)。nameとargsはどちらも、クォートされるべきではありません。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を参照してください。