A self-evaluating form is any form that is not a list or
symbol. Self-evaluating forms evaluate to themselves: the result of
evaluation is the same object that was evaluated. Thus, the number 25
evaluates to 25, and the string "foo"
evaluates to the string
"foo"
. Likewise, evaluating a vector does not cause evaluation
of the elements of the vector—it returns the same vector with its
contents unchanged.
'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
A self-evaluating form yields a value that becomes part of the program,
and you should not try to modify it via setcar
, aset
or
similar operations. The Lisp interpreter might unify the constants
yielded by your program’s self-evaluating forms, so that these
constants might share structure. See Mutability.
It is common to write numbers, characters, strings, and even vectors in Lisp code, taking advantage of the fact that they self-evaluate. However, it is quite unusual to do this for types that lack a read syntax, because there’s no way to write them textually. It is possible to construct Lisp expressions containing these types by means of a Lisp program. Here is an example:
;; 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>