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) {}とかしちゃった感じ。プロトタイプとか欲しいね。