let の中に閉じ込めた lambda は、let で宣言した変数の値を保持している。
つまり "Let Over Lambda" は Closure を生成する。
また、Closure を更に lambda で包むと Closure Generator を定義できる。
;; Counter (Closure) (define cnt (let ((n 0)) (lambda () (set! n (+ n 1)))))
;; Generator (define cnt-generator (lambda () (let ((n 0)) (lambda () (set! n (+ n 1))))))
gosh> (cnt) 1 gosh> (cnt) 2 gosh> (cnt) 3
gosh> (define cnt1 (cnt-generator)) cnt1 gosh> (define cnt2 (cnt-generator)) cnt2 gosh> (cnt1) 1 gosh> (cnt2) 1 gosh> (cnt1) 2 gosh> (cnt1) 3 gosh> (cnt2) 2
参考:
素数夜曲: 女王陛下のLISPP.439~
#Scheme #Lisp #Gauche #Closure #Generator
SN 2013/07/12 23:47:36
Archives > Scheme_Let_Over_Lambda.html