自求值形式(self-evaluating 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 解释器可能会对程序中自求值形式产生的常量进行统一化处理,使得这些常量共享结构。See 可变性。
在 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>