理系学生日記

おまえはいつまで学生気分なのか

問題3.1 (3.1.1 Local State Variables)

修論に本気だす前に2章の最後あたりやってたんですけど,今見ると相当複雑なかんじになってたので,先に進むことにしたのでした.魅惑の3章に突入.


状態変数を持つ個々のオブジェクトが集まってシステムを構成するという見方は,とてもスゴいフレームワークですというお話.個々のオブジェクトが現実のオブジェクトに対応する.
そのときに,シンボル名で状態変数を表すんだったら,当然だけど代入演算子が必要になる.


例として取り上げられているのが銀行口座.

(withdraw 25)
75
(withdraw 25)
50

呼び出しかたは同じなのに,返す値が違うというのはこれまでになかったこと.
それを実現するのがこの定義.

;; 銀行口座の残高
(define balance 100)

;; 引き出し
(define (withdraw amount)
  (if (>= balance amount)
      (begin (set! balance (- balance amount))
	     balance)
      "Insufficient funds"))

set!が代入演算子として作用する.rubyでいう破壊的代入.
こういう代入演算子の導入によって,これまでの置き換えモデルが使えなくなるんだけど,それはまた先のお話ぽい.


次にでてくるのがクロージャ.

(define (make-withdraw balance)
  (lambda (amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds")))

balanceは呼び出された時点で,環境にbindされるみたく考えればいいのかな.

問題3.1

そういうわけで,渡された値をたしまくる計算機を作る関数.

(define (make-accumulator sum)
  (lambda (val)
    (set! sum (+ sum val))
    sum))
(define A (make-accumulator 5)) 
(A 10) ; 15
(A 10) ; 25