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中定义的基础函数)。有关函数和函数调用的更多信息,请参阅函数

求值发生在称为环境的上下文中,也就是由 Lisp 变量的当前值和绑定组成(参见变量)的语境。每当表达式引用一个变量而不为其创建新绑定时,该变量将被求值为当前环境给定的值。表达式求值结果会受环境影响(请参阅局部变量)。

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

不要将求值与命令解释混淆。编辑器的命令循环使用按键映射将键盘输入转换为命令(可交互调用的函数),然后使用call-interactively执行该命令。如果命令是用 Lisp 编写的,则执行命令通常包含求值;但是,此步骤不被视为令键解释的一部分。请参阅命令循环

最后更新于