10.2.1 Самооценивающиеся формы

Самооцениваемая форма (self-evaluating form) — это любая форма, которая не является списком или символом. Самооценивающиеся формы оцениваются сами по себе: результат вычисления — это тот же самый объект, который оценивался. Таким образом, число 25 оценивается как 25, а строка "foo" оценивается как строка "foo". Точно так же, вычисление вектора не вызывает вычисления элементов вектора — оно возвращает тот же вектор с неизменным содержимым.

'123               ; Число, показанное без вычисления.
     ⇒ 123
123                ; Оценивается как обычно — результат тот же.
     ⇒ 123
(eval '123)        ; Оценивается «вручную» — результат тот же.
     ⇒ 123
(eval (eval '123)) ; Двойное вычисление ничего не меняет.
     ⇒ 123

Самооцениваемая форма выдает значение, которое становится частью программы, и вы не должны пытаться изменить его с помощью setcar, aset или аналогичных операций. Интерпретатор Lisp может унифицировать константы, выдаваемые самооцениваемыми формами вашей программы, чтобы эти константы могли иметь общую структуру. См. Изменяемость.

Часто в коде Lisp пишутся числа, символы, строки и даже векторы, используя тот факт, что они самооцениваются. Однако довольно необычно делать это для типов, у которых нет синтаксиса чтения, потому что их невозможно записать текстом. Возможно сконструировать выражения Lisp, содержащие эти типы, с помощью программы Lisp. Вот пример:

;; Создаем выражение, содержащее объект буфера.
(setq print-exp (list 'print (current-buffer)))
     ⇒ (print #<buffer eval.texi>)
;; Вычисляем его.
(eval print-exp)
     -| #<buffer eval.texi>
     ⇒ #<buffer eval.texi>