计算机程序的构造和解释(笔记)
3.2 求值的环境模型
C语言等过程性语言的环境的定义可以从这里找到,可见SICP确实有其厉害之处
先说几个概念
- 代换模型:(结合chap1 url)
将一个复合过程应用于一些实际参数,就是在用各个实际参数代换 过程体里对应的形式参数的意义
- 环境: 一个环境就是框架(frame)的一个序列,每个框架是包含着一些约束的一个表格(可能为空),这些约束将一些变量名字关联于对应的值。每个框架还包括一个环境的指针,指向这一框架的外围环境。
环境对于求值过程是至关重要的,因为它确定了表达式求值的上下文
下面图片可以展示一个环境结构
上图中:A、B、C、D都是环境指针;
变量x和z在框架Ⅱ中约束
当寻找一个变量时,先在当前环境中寻找,没有在前进到其外围环境查找;例如x在框架Ⅲ中,没有其约束,然后其前进到Ⅰ中寻找,确实其值为3
遮蔽:例如x在环境Ⅰ的值为3,但在Ⅱ中为7;这里说的是框架Ⅱ里x与7的约束遮蔽了框架Ⅰ中x与3的约束
另外,我们始终假定存在一个全局环境
3.2.1 求值规则
- 如果要对一个组合表达式求值
- 求值对这一组合式你的各个子表达式(求值规则必须一样,例如都为从左往右)
- 将运算符子表达式的值应用于运算对象子表达式的值
3.2.2 简单过程的应用
这里是一个环境求值展开的例子,可以查看习题答案3.9 url
3.2.3 将框架看作局部状态的展台
个人觉得这里说的是局部变量的状态只适合于某一次该框架(环境)中,脱离了就没意义了;类似C/C++释放了内存的意思吧
3.2.4 内部定义
在环境模型中,以局部过程定义作为程序模块化的有用技术中的两个关键性质:
局部过程的名字不会与包容他们的过程之外的名字相互干扰;这是因为这些局部过程名都是在该过程运行时创建的框架里面约束的,而不是在全局环境里约束的
局部过程只需将包含他们的过程的形参作为自由变量,就可以访问该过程的实际参数。这是因为对于局部过程体的求值所在的环境Ⅳ外围过程求值所在的环境的下属。
更多可以看练习 3.11 url