乐正

Actions speak louder than words.

Sicp-ex3-10

问题

make-withdraw过程里,局部变量balance是作为make-withdraw的参数创建的。我们也可以显示地通过使用let创建局部状态变量,就像下面所做的:

1
2
3
4
5
6
7
(define (make-withdraw initial-amount)
  (let ((balance initial-amount))
    (lambda (amount)
      (if (>= balance amount)
          (begin (set! balance (- balance amount))
                 balance)
          "Insufficient funds"))))

请重温1.3.2节,let实际上是一个过程调用的语法糖衣:

1
(let ((<var> <exp>)) <body>)

它将被解释为

1
((lambda (<var>) <body>) <exp>)

的另一种语法形式。请用环境模型分析make-withdraw的这个版本,画出像上面那样的图示,说明调用:

1
2
3
4
5
(define w1 (make-withdraw 100))

(w1 50)

(define w2 (make-withdraw 100))

时的情况并阐释make-withdraw的这两个版本创建出的对象具有相同的行为。两个版本的环境结构有什么不同吗?

解答

(define w1 (make-withdraw 100))(define w2 (make-withdraw 100))都是一些代码和在全局环境中的一个序对。与另一个make-withdraw过程并无太大区别。

求值环境1

但是在执行(w1 50)时,二者的环境模型便有了较大的区别。

let表达式创建了一个新的环境框架;并且在调用let创建的过程时,又创建了一个环境框架:

求值环境1

draft

« sicp-ex3-9 sicp-ex3-11 »

Comments