[Gauche-devel-jp] Re: syntax-rulesのリテラルの解釈について

Back to archive index

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



Gauche-devel-jp メーリングリストの案内
Back to archive index