ループ変数をクロージャで包む

Gauche で確認コードを書いてみました。

(use srfi-42) ; list-ec

(define (f)
  (list-ec (: i 0 3)
           (lambda () i)))

(define (g)
  (rlet1 lis ()
    (do ((i 0 (+ i 1)))
        ((= i 3))
      (push! lis (lambda () i)))))

実行結果です。

gosh> (map (lambda (f) (f)) (f))
(0 1 2)
gosh> (map (lambda (f) (f)) (g))
(2 1 0)