乐正

Actions speak louder than words.

Sicp-ex3-11

问题

在3.2.3节里我们看到,环境模型能如何用于描述带有局部状态的过程行为,现在我们又看到局部定义如何工作。一个典型的消息传递过程包含这两个方面。现在请考虑3.1.1节的银行账户过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(define (make-account balance)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (dispatch m)
    (cond ((eq? m 'withdraw) withdraw)
          ((eq? m 'deposit) deposit)
          (else (error "Unknown request -- MAKE-ACCOUNT"
                       m))))
  dispatch)

请设法展示由下面交互序列生成的环境结构:

1
2
3
4
5
6
7
(define acc (make-account 50))

((acc 'deposit) 40)
90

((acc 'withdraw) 60)
30

acc的局部状态保存在哪里?假定我们定义了另一个账户:

1
(define acc2 (make-account 100))

这两个账户的局部状态是如何保持不同的?环境结构中的哪些部分被accacc2共享?

解答

其生成的环境结构如下:

练习3.11

由上图可以看到acc的局部状态保存在环境E1中。

如果定义另一个账户acc2,那么它将创建一个和环境E1类似的环境作为它的局部变量保存环境。accacc2都是共享全局环境的。

draft

« sicp-ex3-10 sicp-ex3-12 »

Comments