# 10 求值（DONE）

Lisp 解释器是 Emacs Lisp 中，接收Lisp对象，并将该对象的值作为表达式计算的程序。解释器的具体计算过程取决于该对象的类型，以及本章将要介绍的计算规则。解释器通常会自动的对你的程序进行求值，但也可以显式使用Lisp基础函数eval调用。

以求值为目的的Lisp对象称为表达式 (form / expression)。请注意，表达式是实打实的数据对象，而不是简单的文本表示，这是Lisp类语言与常规编程语言的最根本区别之一。原则上任何对象都可以被求值，但在实际操作中，最常被求值的只有数字、符号、列表以及字符串。

在随后的部分中，我们将详细说明不同表达式的求值规则。

通常读取Lisp表达式后会紧接着对该表达式求值，但你需要注意，读取和求值是两个分离的、不同的操作，而且两者都可以单独运行；读取本身不做任何求值，它仅仅是将文本转换为文本对应的Lisp对象。要一直等到read的调用，才会知道该Lisp对象是作为表达式求值，还是用于其他目的。

求值 是一个递归过程：对表达式求值通常涉及对其子结构求值。例如，当你对函数调用表达式求值时，例如`(car x)`，Emacs 首先对其参数求值（子结构`x`）。在对参数求值后，Emacs*执行*函数 ( `car`)，如果函数是用 Lisp 编写的，则通过对函数*体*求值来执行求值 （但在本例中，`car`不是 Lisp 函数；它是在C中定义的基础函数）。有关函数和函数调用的更多信息，请参阅[函数](https://www.gnu.org/software/emacs/manual/html_node/elisp/Functions.html)。

求值发生在称为环境的上下文中，也就是由 Lisp 变量的当前值和绑定组成（参见[变量](https://www.gnu.org/software/emacs/manual/html_node/elisp/Variables.html)）的语境。每当表达式引用一个变量而不为其创建新绑定时，该变量将被求值为当前环境给定的值。表达式求值结果会受环境影响（请参阅[局部变量](https://www.gnu.org/software/emacs/manual/html_node/elisp/Local-Variables.html)）。

求值可能会带来某些持续存在的改变；这些变动被称为*副作用*。这里有个例子`(setq foo 1)`.

不要将求值与命令解释混淆。编辑器的命令循环使用按键映射将键盘输入转换为命令（可交互调用的函数），然后使用`call-interactively`执行该命令。如果命令是用 Lisp 编写的，则执行命令通常包含求值；但是，此步骤不被视为令键解释的一部分。请参阅[命令循环](https://www.gnu.org/software/emacs/manual/html_node/elisp/Command-Loop.html)。

<br>
