Cの++
演算子のように、変数の値をインクリメントするためのLisp構造を定義したいとしましょう。(inc
x)
のように記述すれば、(setq x (1+ x))
という効果を得たいとします。以下はこれを行うマクロ定義です:
(defmacro inc (var) (list 'setq var (list '1+ var)))
これを(inc x)
のように呼び出すと、引数varはシンボルx
になります —
関数のときのようにx
の値ではありません。このマクロのbodyはこれを展開の構築に使用して、展開形は(setq x
(1+ x))
になります。マクロが一度この展開形をリターンするとLispはそれを評価するので、x
がインクリメントされます。
この述語はその引数がマクロかどうかテストして、もしマクロならt
、それ以外はnil
をリターンする。