1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
;; 在全局环境过程定义 make-withdraw 后产生的过程对象具有 make-withdraw 的代码正
;; 文以及一个指向全局环境的指针;
;; (define w1 (make-withdraw 100)) 如书本所言,将建立一个新环境(E1)建立 形参
;; initial-amount 到数值 100 的约束,此环境的外围环境是全局环境,并在这一环境中
;; 对 make-withdraw 的过程体求值;
;; make-withdraw 的过程体的 let 形式实际上就是 ((lambda (<var>) <body>) <exp>)
;; 的语法糖衣,求值这个复合表达式,通过求值运算符 lambda 表达式将会建立一个过程
;; 对象,该对象由此 lambda 对象的正文和一个指向 E1 的指针,因为这个 lambda 表达
;; 式是在 E1 中求值的;
;; 使用这个匿名过程应用于参数,将会建立起一个新环境 (E2) 建立形参 balance 到实参
;; initial-amount 值的约束,此环境的外围环境是 E1, 并在这一环境中对匿名过程的体
;; 进行求值,此过程体是一个 lambda 表达式,对其求值得到一个过程对象,由 lambda
;; 表达式的代码部分和一个指向 E2 的指针组成,该过程对象作为返回值在最初的定义中
;; 与全局环境中的 w1 建立约束;
;; 所以调用 w1 将会建立起一个新环境,此环境的外围环境由 w1 所约束的过程对象指定
;; 即为 E2, 在新环境中求值 w1 过程对象的过程体时,使用的 balance 变量即是外围环
;; 境 E2 中的变量 balance.
;; 综上,两个版本创建出的过程对象具有相同的行为,因为过程体是一样的,作为过程体
;; 的局部状态变量的值是一样的,只不过第二种形式中多了一层环境。
|