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
は「余分なレベルの評価」が生じたと言われることがあります。