Function EVAL
eval form => result*
form - フォーム
result - formの評価によって生成された返却値
現在の動的環境とnullのレキシカルな環境で、formを評価します。
evalは評価器のユーザーインターフェイスです。
評価器はマクロの呼び出しを macroexpand-1を使用したかのように展開します。
evalによって処理されたコードに定数が現れたとき、 それはコピーされたり合併されたりしません。 evalの実行により返却されたコードが 参照しているオブジェクトは、 ソースコード上の対応するオブジェクトとeqlで一致します。
(setq form '(1+ a) a 999) => 999
(eval form) => 1000
(eval 'form) => (1+ A)
(let ((a '(this would break if eval used local value))) (eval form))
=> 1000なし。
なし。
macroexpand-1, 3.1.2. 評価の規範
シンボルの現在の動的な値を得るには、 symbol-valueを使うのと evalを使うのがそれぞれ有効であり同等です (そして普通は好ましい)。
evalフォームは、その引数を2段階の評価で行うことに注意してください。 最初は、formをどんな呼び出しにも生じる 普通の引数の評価の仕組みで評価します。 この普通の引数の評価による返却値のオブジェクトが formパラメーターの値になり、 それからevalフォームの部分として評価されます。 例えば下記の通り。
(eval (list 'cdr (car '((quote (a . b)) c)))) => b引数のフォーム(list 'cdr (car '((quote (a . b)) c)))は 通常の方法により評価され、引数(quote (a . b)))を生成します。 それからevalはその引数(cdr (quote (a . b)))を評価しbを生成します。 どのような関数のどんな引数でもすでに一回目の評価が生じているので、 evalは「余分なレベルの評価」が生じたと言われることがあります。