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


13.4 マクロの定義

Lispのマクロオブジェクトは、CARmacroCDRが関数であるようなリストです。マクロの展開形はマクロ呼び出しから、評価されていない引数のリストに、(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のリターン値は未定義。

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を参照してください。