10.2.1 自求值表达式(DONE)

所有不是 列表(list) 和 符号(symbol) 的表达式均为 自求值表达式(self-evaluation form)。 顾名思义,自求值表达式的求值结果就是它们本身。也就是说,数字25 求值后 得到 25,字符串 "foo" 求值后得到字符串 "foo"。类似的,对向量求值并不会对其组成元素求值——它会返回向量本身。

'123               ; A number, shown without evaluation.
     ⇒ 123
123                ; Evaluated as usual—result is the same.
     ⇒ 123
(eval '123)        ; Evaluated "by hand"—result is the same.
     ⇒ 123
(eval (eval '123)) ; Evaluating twice changes nothing.
     ⇒ 123

自求值表达式会生成一个融入程序的值。因此你不应当使用 setcar, aset 或者类似的操作去修改它们。Lisp 解释器很可能会在求值后,将这些自求值表达式作为共享的结构,生成统一的常数类型。查阅 可变性 章节。

由于 Lisp 中数字,字符,字符串以及向量都是自求值表达式,我们通常可以直接字面地写它们。不过,有不少类型是缺少读取语法,没有办法直接字面地写。此时,我们可以借用其他 Lisp 表达式 去构造这些结构,这里有一个例子:

;; Build an expression containing a buffer object.
(setq print-exp (list 'print (current-buffer)))
     ⇒ (print #<buffer eval.texi>)
;; Evaluate it.
(eval print-exp)
     -| #<buffer eval.texi>
     ⇒ #<buffer eval.texi>

最后更新于