# 3.2评价的环境模型

> 译者： [https://sicp.comp.nus.edu.sg/chapters/52](https://sicp.comp.nus.edu.sg/chapters/52)



在第1章中介绍复合函数时，我们使用了求值的替换模型（ [1.1.5](7) 部分）来定义将函数应用于参数的含义：

*   要将复合函数应用于自变量，请评估函数的主体，并用相应的自变量替换每个形式参数。

一旦我们将赋值分配到我们的编程语言中，这种定义就不再足够了。 特别是 [3.1.3](51)位置&lt;/quote&gt;。 在我们的新评估模型中，这些场所将保留在称为_环境_的结构中。

环境是_帧_的序列。 每个帧都是_绑定_的表（可能为空），该表将变量名称与其对应的值相关联。 （单个框架最多可以包含任何变量的绑定。）每个框架还具有指向其_封闭环境_的指针，除非出于讨论目的，认为该框架是_全局框架_ 。 变量相对于环境的_值是由变量在包含该变量的绑定的环境中的第一帧中的绑定给出的值。 如果序列中没有帧指定该变量的绑定，则该变量在环境中被称为_未绑定_。_

<figure>_![](img/557dbc7e5ae42888d2823b8275b53e2f.jpg)**[图3.1](52#fig_3.1)** 一个简单的环境结构。_</figure>

图 [3.1](52#fig_3.1) 显示了一个简单的环境结构，该结构由三个帧组成，分别标记为I，II和III。 在该图中，A，B，C和D是指向环境的指针。 C和D指向相同的环境。 变量`z`和`x`绑定在帧II中，而`y`和`x`绑定在帧I中。环境D中`x`的值为3。 环境B也是3。确定如下：我们检查序列中的第一帧（帧III），但未找到`x`的绑定，因此我们进入封闭环境D，并在帧I中找到绑定 另一方面，环境A中`x`的值为7，因为序列中的第一帧（帧II）包含`x`与7的绑定。对于环境A，`x`的绑定 帧II中的[7]到7被称为_阴影_帧1中`x`与3的绑定。

环境对于评估过程至关重要，因为环境决定了要评估表达式的上下文。 的确，可以说编程语言中的表达式本身没有任何意义。 而是，表达式仅相对于对其进行评估的某些环境才具有含义。 &lt;split&gt;甚至像`display(1)`一样简单的表达式的解释，也取决于一种理解，即在`display`表示显示值的原始函数的上下文中进行操作。 因此，在我们的评估模型中，我们将始终谈到评估某种环境下的表达。 为了描述与解释器的交互，我们将假设有一个程序环境，它由一个框架（直接在全局环境内部）组成，其中包括与原始函数关联的符号的值。 例如，通过说变量`display`在全局环境中绑定到相应的原始函数，可以捕捉到`display`是用于显示值的原始函数的想法。&lt;/split&gt;

