# 1.1.3评估算子组合

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

<split>本章的目标之一是隔离有关流程描述的问题。 作为一个恰当的例子，让我们考虑一下，在评估运算符组合时，解释器的处理过程如下。

*   要评估运算符组合，请执行以下操作：
    1.  评估组合的操作数表达式。
    2.  将运算符表示的函数应用于作为操作数值的参数。

Even this simple rule illustrates some important points about processes in general. First, observe that the first step dictates that in order to accomplish the evaluation process for an operator expression we must first perform the evaluation process on each operand of the operator combination. Thus, the evaluation rule is _recursive_ in nature; that is, it includes, as one of its steps, the need to invoke the rule itself.

请注意，在深度嵌套的组合的情况下，递归的想法可以多么简洁地用来表示什么，否则将其视为相当复杂的过程。 例如，评估

```js
(2 + 4 * 6) * (3 + 12);
```

requires that the evaluation rule be applied to four different combinations. We can obtain a picture of this process by representing the combination in the form of a tree, as shown in Figure <ref name="fig:tree-comb-javascript">[1.1](5#fig_1.1)</ref>. Each combination is represented by a node with branches corresponding to the operator and the operands of the operator combination stemming from it. The terminal nodes (that is, nodes with no branches stemming from them) represent either operators or numbers. Viewing evaluation in terms of the tree, we can imagine that the values of the operands percolate upward, starting from the terminal nodes and then combining at higher and higher levels. In general, we shall see that recursion is a very powerful technique for dealing with hierarchical, treelike objects. In fact, the <quote>percolate values upward</quote> form of the evaluation rule is an example of a general kind of process known as _tree accumulation_.

<figure>![](img/a7ff0cb78176667e6e8029c00b2b52a2.jpg)**[Figure 1.1](5#fig_1.1)** Tree representation, showing the value of each subexpression.</figure></split>  <split>接下来，观察到第一步的重复应用使我们到达了需要评估的地方，而不是算子组合，而是数字或名称之类的原始表达式。 我们通过规定

*   数字的值就是它们命名的数字，
*   名称的值是环境中与这些名称关联的对象。</split>  <split>请注意环境在确定表达式中名称的含义方面的作用。 在JavaScript中，谈论诸如`x + 1`之类的表达式的值而没有指定任何有关环境的信息（会为名称`x`提供含义）是毫无意义的。 正如我们将在第三章中看到的那样，环境的一般概念是提供进行评估的环境，这将在我们对程序执行的理解中发挥重要作用。</split>  <split>请注意，上面给出的求值规则不处理常量声明。 例如，评估`const x = 3;`不会将`=`运算符应用于两个参数，其中一个是名称`x`的值，另一个是3，因为常量声明的目的正是为了关联 `x`和一个值。 （也就是说，常量声明`const x = 3;`中的`x = 3`部分不是运算符组合。）</split>  <split>常量声明中的字符串 &lt;quote&gt;`const`&lt;/quote&gt; 用粗体字母表示，表示它是JavaScript中的_关键字_。 关键字是保留字，带有特定含义，因此不能用作名称。 关键字或关键字组合指示JavaScript解释器以特殊方式处理相应的语句。 每个这样的语法形式都有其自己的评估规则。 各种语句（每种都有其关联的评估规则）构成了编程语言的语法。</split>