1.6.1 评估内部列表

如果对嵌套在另一个列表中的内部列表进行评估,外部列表在评估时可能会使用内层列表的评估结果作为信息。这解释了为什么要首先对内部表达式进行评估:它们的返回值会被外部表达式使用。

我们可以通过对另一个加法示例进行评估来调查这个过程。将光标置于以下表达式之后,键入C-x C-e

(+ 2 (+ 3 3))

数字8将会出现在回显区域。

过程是这样的,Lisp解释器首先对内部表达式(+ 3 3)进行评估,返回值是6;然后它对外部表达式评估,就像表达式写成(+ 2 6)一样,返回值是8。由于没有更多外层表达式需要评估,解释器将这个值打印在回显区域。

现在很容易理解C-x C-e这个快捷键所调用命令的名称 eval-last-sexpsexp是“symbolic expression”(符号表达式)的缩写,而eval是“evaluate”(评估)的缩写。该命令对最后一个符号表达式进行评估。

作为实验,您可以尝试通过将光标放在表达式后面紧跟的下一行行首,或者放在表达式内部来评估该表达式。

下面是表达式的另一份副本:

(+ 2 (+ 3 3))

如果将光标放在紧随表达式后面的空白行行首,然后键入 C-x C-e,您仍然会在回显区域中看到打印的值8。现在试着将光标放在表达式内部。如果将光标放在倒数第二个括号后(使它看起来位于最后一个括号上方),您会在回显区域看到打印的值6!这是因为该命令评估了表达式 (+ 3 3)

现在将光标放在一个数字后面。键入 C-x C-e,您会得到那个数字本身。在Lisp中,对一个数字评估会直接返回这个数字本身——这是数字与符号的区别。如果对以像 + 这样的符号开头的列表评估,您会得到一个返回值,该返回值是计算机执行附加在该符号上的函数定义中的指令所得到的结果。如果单独对一个符号评估,会发生一些不同的事情,我们将在下一节看到。