Common Lisp の評価について
途中。
役割 | カスタマイズ | 備考 | CLHS |
Read | reader-macro, get-macro-character | Read 時に動作するマクロ | http://www.lispworks.com/documentation/HyperSpec/Body/02_b.htm |
Eval Symbol | symbol-macro | symbol に対するマクロ | http://www.lispworks.com/documentation/HyperSpec/Body/03_abaa.htm |
Eval Conses | macro-form, macro-function | マクロ | http://www.lispworks.com/documentation/HyperSpec/Body/03_ababb.htm |
Compile | compiler-macro | コンパイル時に機能するマクロ | http://www.lispworks.com/documentation/HyperSpec/Body/03_bba.htm |
コンパイラマクロ
- コンパイラマクロ実例; http://lispuser.net/memo/lisp/2007-04-01-14-57.html
- Movitz(http://common-lisp.net/project/movitz/) のソースを見ると、山ほど define-compiler-macro を使っている。クロスコンパイラのため?一方 sbcl ではあまり多くない。
- 実質マクロなので関数の定義を上書きできる。例えば通常時は足し算を行う関数なのにコンパイルされるとかけ算を行う、といった全く無意味なものさえ作れる。
自作 scheme コンパイラでは、組み込み関数を LLVM に変換するという知識(ルール)は、コンパイラ中に match を使った式変形として埋め込まれてしまっている。全ての組み込み関数に compiler-macro-function 相当を定義し、それによってコンパイルする、という仕組みにするとエレガント?