00:00:31 <g000022> Common Lispの場合は、Schemeとちがって、,は、`の内側でないとエラーになりますが、それについての解説があります
00:01:38 <g000022> あとは、,を使って評価する部分を指定する等々の解説です
00:02:46 <g000022> ((((Beyond the obvious, part 1: compute, then generate))))
00:04:13 <g000022> シンプルなテキストの置き換えから、より複雑な式の変形を用いたマクロの説明です
00:05:09 <g000022> また、マクロによって実行時の計算をコンパイル時に実行することについても解説されます
00:12:19 <g000022> ゲームを題材として、sin rの計算を実行時に沢山しているのを、マクロを使ってコンパイル時に計算できるところを計算してしまい、あとはテーブル引きにしてしまおうという例が解説されています
00:13:09 <g000022> ((((Beyond the obvious, part 2: macros that define macros))))
00:17:12 <g000022> マクロを生成するマクロの解説と、問題点が説明されています
00:27:33 <g000022> マクロが生成したマクロは、展開時の情報を保持しているので、必要な場合は再コンパイルしないと古い情報を参照してしまう危険性があることが説明されています
00:28:45 <g000022> ここでは、defsynonymというマクロを例にしていますが、脚注でエイリアスのためにマクロで短い名前を付けるのは、こういう問題があるので止めようという解説がされています。ちょっと横道にそれてる感じではありますが
00:28:52 <g000022> ((((Tricks of the trade: elude capture using GENSYM))))
00:35:10 <g000022> マクロを作る際には、変数の意図しない捕捉、衝突、意図しない多重評価等がありますが、これらを解消する方法を、gensymの使い方と合せて解説されています
00:35:39 <g000022> この辺りは基本なので、他の本にも必ず書いてあるところですね
00:35:44 <g000022> ((((Macros vs. inlining))))
00:40:48 <g000022> Common Lispには関数のinline化がサポートされていますが、この機能は処理系によっては、されたりされなかったりする、ということが説明されています
00:42:09 <g000022> 著者のアドバイスとして、マクロは、構文の拡張のみに使うべきて、パフォーマンスハックとしてインライン展開を手作りでするようなことは、どうしても他に手段がない場合を除いて控えるべき、というようなことが書いてあります
00:43:16 <g000022> たとえば、先に述べた再コンパイルの問題等、ということですが、inlineも同じ問題がある気もしますね
00:43:36 <g000022> まあ、とりあえず指針としては正しい気はします
00:44:53 <g000022> ということで、20章は終わりです。次回は、21章からです
00:45:22 [g000022'out] ; Quit: (q)
02:37:54 [ksmakoto_'out] ; *.net *.split
02:37:54 [g000001'out] ; *.net *.split
02:38:47 [g000001'in]
03:20:44 [ksmakoto_'in]
05:28:46 [r_takaishi_'out] ; Ping timeout: 245 seconds
05:35:32 [r_takaishi_'in]
13:18:08 [ksmakoto__'in]
13:18:22 [ksmakoto_'out] ; Read error: Connection reset by peer
23:22:18 [saia'in]