Самооцениваемая форма (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>