10.1 求值简介

Lisp 解释器(或称求值器)是 Emacs 中负责计算给定表达式的值的部分。当调用一个用 Lisp 编写的函数时,求值器会通过对函数体中的表达式依次求值,来计算该函数的返回值。因此,运行任何 Lisp 程序,本质上都是在运行 Lisp 解释器。

用于求值的 Lisp 对象被称为 形式(form)表达式(expression) 8。形式是数据对象而非单纯的文本,这是类 Lisp 语言与常规编程语言的核心区别之一。任何对象都可被求值,但实际应用中,数字、符号、列表和字符串是最常被求值的类型。

在后续章节中,我们将详细说明对各类形式进行求值的具体含义。

读取一个 Lisp 形式并对其求值是极为常见的操作,但读取与求值是相互独立的行为,二者均可单独执行。读取操作本身不会对任何内容进行求值;它仅将 Lisp 对象的打印表示形式转换为对象本身。至于该对象是待求值的形式,还是承担完全不同的用途,则由 read 函数的调用者决定。See 输入函数

求值是一个递归过程,对一个形式求值通常需要先对该形式内部的各个部分求值。例如,当你对一个 函数调用(function call) 形式(如 (car x))求值时,Emacs 会先对参数(子形式 x)求值。参数求值完成后,Emacs 会执行该函数(car);如果该函数是用 Lisp 编写的,执行过程就是对 函数体(body of the function) 进行求值(不过在本例中,car 并非 Lisp 函数,而是用 C 语言实现的原语函数)。See 函数,了解更多关于函数与函数调用的内容。

求值在一个被称为 环境(environment) 的上下文中进行,环境由所有 Lisp 变量的当前值和绑定构成(see 变量)。9 当一个形式引用某个变量但并未为其创建新绑定时,该变量会求值为当前环境所给出的值。对一个形式求值也可能通过绑定变量来临时改变环境(see 局部变量)。

对一个形式进行求值,还可能产生会持续存在的修改,这类修改称为 副作用(side effect)。产生副作用的一个典型例子是形式 (setq foo 1)

不要把求值与按键解释混为一谈。编辑器的命令循环通过当前激活的键映射,将键盘输入转换为一条命令(一个可交互调用的函数),然后使用 call-interactively 执行该命令。如果该命令是用 Lisp 编写的,执行命令时通常会涉及求值;但这一步不属于按键解释的范畴。See Command Loop


Footnotes

(8)

有时也被称作 S 表达式(S-expression)sexp,但本手册中一般不使用这一术语。

(9)

这里对 “环境(environment)” 的定义特意不包含所有可能影响程序运行结果的数据。

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike