# 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>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://emacs-lisp.ivory.cafe/qiu-zhi/untitled.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
