どんな時にマクロが必要なのか

OnLispの該当部分によると「引数の評価を制御したいとき」にマクロを使うべきである、とある。例えば下のsetfなら第1引数の内容を見てどこにaを代入するべきか決める必要がある。

(setf (car x) 'a)

仮にここで第1引数が(car x)ではなくてただの変数であったとしたらマクロである必然性はないけど、この例のように引数を変形したりリストの内容を見たりする必要のあるオペレータはマクロでしか書けない。もしsetfが関数であったら第1引数を評価しようとするだろう。するとsetfは「ある場所に値を代入したい」という本来の目的を達成できなくなる。
マクロは結局インライン展開であるので、以下のマクロのyはそのマクロを呼び出したレキシカルコンテキストに従う。

(defmacro foo (x)
      `(+ ,x y))

マクロがインライン展開であるということには色々功罪があって、引数の評価を制御できるという最大の利点の他に意図しない変数捕捉が起こる可能性がある、ということがある。上のyがそのマクロを呼び出したレキシカルコンテキストに従うということは、マクロfooの挙動はどういう文脈で呼ばれているかに依存するということである。それに呼び出し元で定義されている名前とマクロの中で一時的に使っている名前が衝突したりもする。

ところで、ある手続きがどんなコンテキストで呼ばれてもその挙動は引数のみに依存する、という性質は参照透明性と呼ばれる。これによってプログラマは思考対象の範囲を著しく絞ることができる。