fixedpoint.jp - ケーススタディ: Three Dogmas of Scheme のコード




ケーススタディ: Three Dogmas of Scheme のコード

gauche.night の座談会で「R6RS のここがおかしい」という指摘を黒田氏がされていました。その問題提起のうちのいくつかが"Three Dogmas of Scheme"で公開されています。

挙げられているポイントは3つで

そのうち、最初の再帰については Common Lisp のコードで do の変数束縛に関する振る舞いが例になっています。この do で始まる式を Gauche で評価すると

k.scm
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 を使うことです:

p.scm
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> 

© 2006-2008 Takeshi Abe