2008/12/31

【scheme】クロージャ

よく見るクロージャのサンプルをSchemeで書いてみた。初期値を取って、呼ばれるたびにインクリメントした値を返す関数を返す関数。こういうの見るとOOPっているの?ってならないか。

(define counter 
  (lambda (n)
    (lambda ()
      (set! n (+ n 1)) n)))

(define disp
  (lambda (s)
    (display s)
    (newline)))

(let ((c (counter 0)))
  (disp (c));;=> 1
  (disp (c));;=> 2
  (disp (c));;=> 3
  (disp (c));;=> 4
  (disp (c)));;=> 5

(let ((c2 (counter 10)))
  (disp (c2));;=> 11
  (disp (c2));;=> 12
  (disp (c2));;=> 13
  (disp (c2)));;=> 14

0 件のコメント:

コメントを投稿