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 がインクリメントされます。
この述語は、引数がマクロであるかどうかを判定し、そうであれば t を、そうでなければ nil を返します。