Shiro Kawai
shiro****@lava*****
2004年 8月 24日 (火) 19:20:33 JST
R5RSマクロはダークコーナーがありすぎて、私も100%自信が無いん ですが、おっしゃる通り、一時変数を生成する部分はR5RSマクロの中 でも最も弱い部分の一つだと思います。今まで見たsyntax-rulesの 例は、いずれもこういう場合は再帰してひとつづつ一時変数を生成 していました。 まず、 「一回のマクロ展開時に挿入される同名の識別子は同一の識別子となる」 「異なるマクロ展開時に挿入された識別子は同名であっても別の識別子となる」 というのが原則ですよね。再帰でひとつづつ一時変数を生成する方法が 動くのは後者の原理によります。 ここで前者をそのまま受け取れば、たとえ<...>で繰り返しになっていても、 %tはマクロテンプレートで挿入された識別子ですから、同一の識別子 としなければならないことになりそうです。 Gaucheの実装では、識別子の同一性をidentifierオブジェクトの 同一性で見ているので(*)、<...>の繰り返し毎に別オブジェクトを 生成してやれば、別識別子とすることは可能かもしれませんが、 Dybvigらのsyntax-case論文(**)ではマクロ展開前と展開後に 識別子にマークをつけることで同一性を取っており、それだと 「名前が同じで、同じ展開時に導入された識別子」を差別化する ことは不可能になります。 従って、このような場合は%tは全て同一の識別子、となるのが コンセンサスなのではないかと思われます。 syntax-caseを使えば、一時変数の一括生成はできます (Dybvig論文(**)参照) syntax-rulesでこれが簡単に出来ないのは結構大きな問題だと思います。 (*) 実は、この方式ではマクロを生成するマクロがうまくハンドリング 出来ないことがあるので、変えるかもしれません。 (**) Dybvig. "Writing Hygenic Macros in Scheme with Syntax-Case". Computer Science Department, Indiana University. TR-356. June 1992. --shiro