gauche.night の座談会で「R6RS のここがおかしい」という指摘を黒田氏がされていました。その問題提起のうちのいくつかが"Three Dogmas of Scheme"で公開されています。
挙げられているポイントは3つで
そのうち、最初の再帰については Common Lisp のコードで do
の変数束縛に関する振る舞いが例になっています。この do
で始まる式を Gauche で評価すると
gosh> (define x
(do ((i 0 (+ i 1))
(l '() (cons (lambda () i) l)))
((>= i 5) l)))
x
gosh> (map (lambda (e) (e)) x)
(4 3 2 1 0)
gosh>
となり、黒田氏の指摘のとおりになります(R5RS および R6RS に即しています)。
再帰と繰り返しの比較にこの例を挙げることについては sumii 氏が反論されています(http://d.hatena.ne.jp/sumii/20080311/p2)が、実際このコードに似たことを Gauche でやるには?
1つの案は parameter を使うことです:
gosh> (use gauche.parameter)
#<undef>
gosh> (define x
(do ((i (make-parameter 0))
(l '() (cons i l)))
((>= (i) 5) l)
(i (+ (i) 1))))
x
gosh> (map (lambda (e) (e)) x)
(5 5 5 5 5)
gosh>