マクロについてメモ

Lispのマクロについて、書籍の抜粋メモ。

マクロの使いドコロ

On Lisp 8.1 他の手段では不可能なとき の項より

マクロにできて関数にできないことは2つある:

  • まずマクロは引数の評価を制御(または抑制)できること
  • また呼び出し側のコンテキスト内へ直に展開されること

だ。結局マクロが必要なアプリケーションには、これらの性質の片方または両方が必要なのだ。

LOL 2.3 制御構造 の項より

「関数ではできない時だけマクロを使う」という言葉は、

  • ある引数を評価しないか
  • 違う順番で評価をするか
  • 二度以上評価する

ような定義をしたければ、どんな定義でもマクロを使う必要があるだろう、
という意味である。

LOL 2.4 自由変数 の項より

事実、いったんそれに慣れてしまうと、できる限りいつでもマクロを書いてレキシカルコンテキストを拡張しようとし、関数を使うのは引数を評価する必要がある時か、単に怖気づいたか、新しいレキシカルコンテキストが欲しい時だけになるLispプログラマもいるくらいである。

LOL 2.7 構文の二重性 の項より

この二重構文を使えば、単一で共通のインタフェースを持ちながら、ダイナミックコンテキストとレキシカルコンテキストの両方で便利な展開を行うマクロを書ける。

On Lisp 7.1 マクロはどのように動作するか の項より

コンパイラが読む情報を書き換えられるというのはコンパイラを書き換えられるのとほとんど同じだ。

On Lisp 8.3 マクロの応用例 の項より

マクロが一般にどう使われるかについては、「主に構文変換に使われる」と言えば一番近いだろう。

LOL 4.4 macroletを使ったコードウォーク

macroletはCOMMON LISPのコードウォーカーとコミュニケーションするためのものであり、マクロの展開がいつ行われるかについては、コンパイル済み関数の実行時より前に完了することだけが保証される。

マクロの使い方

On Lisp 4.1 ユーティリティの誕生 の項より

ボトムアッププログラミングに上達するには、足りないオペレータがまだ書かれていないものだったときにも、同じような不快感を抱くようにならなくてはいけない。

LOL 4.2 トップダウンプログラミング の項より

本格的なマクロを構築するその第一歩は常に、マクロのユースケースを書くことである。

参考文献

On Lisp

On Lisp

LET OVER LAMBDA Edition 1.0

LET OVER LAMBDA Edition 1.0