状態を持った手続きを作る


Tags: R6RS, 手続き

手続きの字句環境を閉じ込むことで状態を持った手続きを作ることができる。

(import (rnrs))

(define count
  (let ((n 0))
    (lambda ()
      (let ((r n))
        (set! n (+ n 1))
        r))))

(count) ; => 0
(count) ; => 1
(count) ; => 2

こうすることで大域的な名前空間を汚染せずに手続きに状態を持たせることができる。

さらにこれを高階化することもできる。

(import (rnrs))

(define (make-counter init)
  (let ((n init))
    (lambda ()
      (let ((r n))
        (set! n (+ n 1))
        r))))

(define c1 (make-counter 0))
(define c2 (make-counter 5))

(c1) ; => 0
(c2) ; => 5
(c2) ; => 6
(c1) ; => 1