(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))
あ! amount: 50 消すの忘れてた.