3.2评估的环境模型
当我们在第一章介绍复合程序时,在1.1.5部分中,我们使用评估的替换模型来定义出把程序应用到参数上的含义。
为了应用一个复合程序到参数上,要评估程序体,并且把形式参数替换成对应的实际参数。
一旦我们把赋值语句加入到我们的语言中,这样的定义就不充足了。特别是在3.1.3部分中的讨论那样,
有赋值语句的存在,一个变量不再被认为仅是一个值的名称了。而是一个变量必须要在某种程度上
控制一个值被存储的地方。在我们的新的评估模型中,这些地方被维护在叫做环境的结构中。
一个环境是一个帧的序列。任何一个帧是一个表,它可能是空的,在表中有对变量的名称和值的关联的信息。
(一个帧中可能包括着对任何一个变量的最多一个绑定)。任何一个帧也都有一个指针指向它的外部的环境。
为了讨论的需要,这个帧被认为是全局的。在一个环境中的一个变量的值,是由包含了这个变量的绑定的环境的
第一帧中的变量绑定的值。如果没有帧指定了变量的绑定,那么变量被告知,在环境中没有绑定。
——————
| I |
| x:3 |
| y:5 |
------------
^ ^
C | | D
----------- | | |-----------
| II| | | | III|
|z:6 |---| |-------|n:1 |
|x:7 | |y:2 |
----------- ------------
^ ^
| |
A B
图3.1 一个简单的环境变量
图3.1显示出一个简单的环境结构包括三个帧。标签是I,II,III。在图例的,ABCD是指向环境的指针。
C和D指向相同的环境。变量z和x被绑定在帧II中。 变量y和x被绑定在帧 I中。 变量 x在环境 D中的值是3,
变量 x在环境 B中的值 也是3。这是按照如下的方式决定的。
我们检查序列中的第一个帧也就是帧III,没有发现变量x的绑定。所以我们继续找到外部的环境D,找到帧I中的绑定。
另一个方面,在环境A中的变量x的值是7。因为在序列的第一个帧中也就是帧II中包括了变量x的绑定,值为7。
对于环境A来说,在帧II中的变量x绑定为7,覆盖了在帧I中的变量x绑定为3。
对于评估流程来说,环境是重要的,因为它决定了表达式被评估的上下文。的确,一种可能的说法是在编程语言中的表达式
不能说有任意的含义。而是,一个表达式有一个意义仅当它在某种环境中被评估。即使是表达式的解释像
(+ 1 1)正常,依赖于对+这个符号的加法的操作的理解。 因此,在我们的评估的模型中,我们总是说评估一个表达式,在
某个环境中。为了描述与解释器的交互,我们将假定有一个全局的环境,包括一个单独的帧。这个帧没有外部环境。
包括关联到原生程序的符号的值。例如,+是一个做加法的符号,也可以说,符号+被绑定到了全局环境中的原生的加法程序。