SICPを読む(100) 問題 3.11 - 内側ののdefine
とうとう100回を迎えてしまったが、SICPは半分も進んでいない。長い戦いになりそうだ。
問題 3.11
銀行口座手続きの説明をせよ。という問題。
とりあえず、内側のdefineについてfactで考える。内側のdefineはletrecと同様と考えればいい。じゃぁ、letrecはどうなってるかというと、
(define (fact n) ((lambda (iter) (set! iter (lambda (n) (if (zero? n) 1 (* n (iter (- n 1)))))) (iter n)) 'dummy)) (fact 10) ; 3628800
なんとも美しくない図だったりする。
で、銀行口座。簡単に書くと、
(define (make-account balance) (define (withdraw amount) 'dummy) (define (deposit amount) 'dummy) (define (dispatch m) 'dummy) dispatch)
つまり、lambdaに直すと、
(define make-account (lambda (balance) (define (withdraw amount) 'dummy) (define (deposit amount) 'dummy) (define (dispatch m) 'dummy) dispatch))
make-accountすると。
(define acc (make-account 50)) ; +acc----- ; | balance : 50 ; | withdraw ; | deposit ; | dispatch ; +--------
こんなん。
2つのアカウントを作っても共有する環境構造は無い。
なんか凄く無駄な部分がある気がする。
JSで言うと、全部this.withdraw = function(amount) {}とかしちゃった感じ。プロトタイプとか欲しいね。