C言語の演算子++
のように、
変数の値を増加させるLispの構文を定義したいとしましょう。
(inc x)
のように書いて、
(setq x (1+ x))
のような効果を得たいのです。
これを行うマクロ定義はつぎのようになります。
(defmacro inc (var) (list 'setq var (list '1+ var)))
これを(inc x)
のように呼び出すと、
引数varはシンボルx
になります。
関数のようにx
の値ではありません。
マクロの本体では、これを使って展開形(setq x (1+ x))
を構築します。
マクロ定義がこの展開形を返すと、
Lispはそれを評価することに進み、x
を増やします。