読んでいて「おっ」と思ったところを、メモっておいても良いですか?
関数定義内にあるマクロ呼び出しは関数がコンパイルされるときに展開形に置換される. マクロを呼び出す関数がコンパイルされた後にそのマクロを再定義したらどうなるだろうか? 元々のマクロ呼び出しの形跡は残っていないので,関数内の展開形は更新されない.
applyやfuncallの第1引数としては渡せないし, 呼出側の関数が新たなローカルな束縛を生むような環境では使うべきでない.
マクロ呼び出しは,書かれた所に直接展開される.
マクロはマクロ呼び出し内の引数の評価を制御する. 評価回数は引数がマクロの展開コードのどこに置かれるかによるが, 1回でも複数回でも良いし,全く評価しないこともある.
Lispプログラムでのマクロ展開は全てプログラムがコンパイルされたときに行われ, コンパイル時に実行できるどのような計算も,実行時にプログラムを遅くすることはない.
関数は(例えばapplyに)引数として渡すことも,関数から返すことも, データ構造内に格納することもできる. マクロではそれらはどれも不可能だ. これらはマクロ呼び出しをλ式で包むことで実現できる場合がある.
言われてみれば、そりゃそうだ、というものが多い気もしますが、なるほどです。
LET OVER LAMBDA Edition 1.0 もおもしろいけど、On Lisp はもっとおもしろい。LET OVER LAMBDA Edition 1.0 の著者が以下のように言うのもわかる気がする。
マクロに興味を持つ者なら誰もが、On Lisp の一言一句を逃さず読まなければならない。
こんなに引用ばかりで良いのかな。でもメモっておきたかったので。
0 件のコメント:
コメントを投稿