About

what kind of things interest me?

Looking for something specific?

 
# コンパイル時の計算. マクロ呼び出しには,2つの時点での処理が関わってくる. マクロの展開時と,展開形の評価時だ. Lispプログラムでのマクロ展開は全てプログラムがコンパイルされたときに行われ, コンパイル時に実行できるどのような計算も,実行時にプログラムを遅くすることはない. オペレータが仕事の一部をマクロ展開の段階で済ませるように書けるなら, マクロとして書く方が効率がよいだろう. 賢いコンパイラでもできないようなことがあれば, 結局実行時に関数がこなすことになるのだから. 第13章ではavgのように展開時に仕事を行うマクロについて説明する.
# Lispとの緊密な連携. 関数ではなくマクロを使うと,プログラムをLispと緊密に連携させられることがある. ある問題を解くプログラムを書く代わりに, マクロを使ってその問題をLispが既に解法を知っているような問題へ変形できるときがある. このアプローチが可能なときは,大抵プログラムは小さくかつ効率的になる: Lispが処理を代わりに行ってくれるので小さくなり, Lisp処理系の製品は一般的にユーザのプログラムより無駄を削いであるから効率がよくなる,という訳だ. この長所は主に埋め込み言語で明らかになるが,それについての説明は第19章から始まる.
# 関数呼び出しの節約. マクロ呼び出しは,書かれた所に直接展開される. だからよく使われるコードのまとまりをマクロとして定義しておけば, それが使われる度に関数を呼び出さなくともよい. Lispの古い方言では,プログラマは実行時の関数呼び出しを節約するために, マクロのこの性質を活用していた. Common Lispでは,この仕事はインライン宣言された関数が代わりに行うものとされている. 関数をインライン宣言することで, コンパイルされたら呼出側コードの中に埋め込まれるよう指示できる. マクロと全く同じだ. しかし,ここでは理想と現実のギャップが出てくる. CLtL2 (p. 229)には「コンパイラがこの宣言を無視するのはフリーである」とあり, 幾つかのCommon Lispコンパイラは確かに無視している. そのようなコンパイラを使わざるを得ないのなら, 関数呼び出しの節約にマクロを使うのも認められるだろう. 
2009.09.25  2:55am  
      
RSS
a Tumblr theme by Robert Boylan