Shiro Kawai
shiro****@lava*****
2005年 5月 16日 (月) 20:20:32 JST
From: 木谷 洋 <ryute****@mac*****> Subject: [Gauche-devel-jp] Re: syntax-rulesのリテラルの解釈について Date: Mon, 16 May 2005 20:00:28 +0900 > 木谷です。 > On 2005年 5月 16日 , at 8:37, Shiro Kawai wrote: > > R5RSマクロのダークコーナーについては、Oleg Kiselyovさんの > > ページにたくさん記事があります。 > > http://okmij.org/ftp/Scheme/macros.html > Gaucheの結果もありますね。 > (letrec1 ((x 1) (y 2)) (+ x y))) > が4ですか。ううむ。。 これはdefineと普通の式が混じったbeginに展開されるので、 トップレベルで使われた場合、R5RS的には不正なプログラムになります (トップレベルのbeginは定義のみを含むか、式のみを含むかでないと ならない)。でも確かに何が起こっているかわかりにくいですね。 何が起こっているかというと:letrec1はsyntax-rulesで一時変数を 生成していて、それらは全てnewtempという名前なんですが異なるマクロ 呼び出しの度に生成されているんで異なる識別子になります。ところが そういう識別子が『トップレベルで定義される名前』に使われた場合の 動作がR5RS的に未定義なんです。 Gaucheではその場合、識別子の環境が無視されるんで、ふたつのnewtemp は同じ変数と解釈されてしまいます。 トップレベルでない場合は、ふたつのnewtempが別々の識別子と認識されます。 (let () (letrec1 ((x 1) (y 2)) (+ x y))) ==> 3 --shiro