理系学生日記

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

問題3-10 (3.2.3 Frames as the Repository of Local State)

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

ここに (let ( ( ) ) )( (lambda () ) )のシンタックスシュガーであるということを考慮すると,上のはこんな感じで置き換えられる.

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

lambdaが2つになって,とてもキレイだ!


今回の課題は,以下の各呼び出しで,環境はどう変わっていくかだ!

(define W1 (make-withdraw 100))

initial-amountが100であるような環境ができた瞬間に,

  ((lambda (balance) 
     (lambda (amount)
       (if (>= balance amount)
	   (begin (set! balance (- balance amount))
		  balance)
	   "Insufficient funds")))
   initial-amount))

によって,balanceがinitial-amountにbindされた環境ができあがって,こんな感じになるのかなとか思っています!

(W1 50)

W1が適用されることで,balanceがinitial-amountから50にbindされるようになる.

(define W2 (make-withdraw 100))

これはW1には影響を及ぼさない.

あ! amount: 50 消すの忘れてた.