自己評価フォーム(self-evaluating
form)はリストやシンボルではないすべてのフォームです。自己評価フォームはそのフォーム自身を評価します。評価の結果は評価されたオブジェクトと同じです。したがって数字の25は25、文字列"foo"
は文字列"foo"
に評価されます。同様にベクターの評価では、ベクターの要素の評価は発生しません
— 内容が変更されずに同じベクターがリターンされます。
'123 ; 評価されずに表示される数字
⇒ 123
123 ; 通常どおり評価され、同じものがreturnされる
⇒ 123
(eval '123) ; 手動での評価 — 同じものがreturnされる
⇒ 123
(eval (eval '123)) ; 2度評価しても何も変わらない。
⇒ 123
自己評価フォームはプログラムの一部となる値を生成します。これをsetcar
やaset
、その他の類似操作を通じて変更しようと試みるべきではありません。Lispインタープリターがプログラム中の自己評価フォームにより生成される定数を統合して、これらの定数が構造を共有するかもしれません。可変性を参照してください。
自己評価されるという事実による利点から数字、文字、文字列、そしてベクターでさえLispコード内で記述されるのが一般的です。しかし入力構文がない型にたいしてこれを行なうのは極めて異例です。なぜなら、これらをテキスト的に記述する方法がないからです。Lispプログラムを使用してこれらの型を含むLisp式を構築することは可能です。以下は例です:
;; バッファーオブジェクトを含む式を構築する。
(setq print-exp (list 'print (current-buffer)))
⇒ (print #<buffer eval-ja.texi>)
;; それを評価する。
(eval print-exp)
-| #<buffer eval-ja.texi>
⇒ #<buffer eval-ja.texi>