Common Lisp のEVAL
関数の結果の理解に苦しむので質問させていただきます。
ポール・グレアム『Ansi Common Lisp』
EVAL
は式を引数とし、それを評価し、その値を返す。
例として、以下の式が載っています。
CL
1> (eval '(+ 1 2 3)) 26 3> (eval '(format t "Hello")) 4Hello 5NIL
「式の前にクオートを付けているのは、評価しないようにだな~」と考えたのですが、クオート無しでも同じ結果になります。
CL
1> (eval (+ 1 2 3)) ; クオートを消した。 26
クオートをとっても同じ結果となります。変だと思い、他の関数でもできるのかなとlist
関数を使ってみると、list
はクオート無しではエラーになります。
CL
1> (eval '(list 1 2 3)) ; クオート有 2(1 2 3) 3 4> (eval (list 1 2 3)) ; クオート無 5; caught ERROR: 6; illegal function call 7
多数クオートを付けてみました。期待通りの結果です。
CL
1CL-USER> (eval '(list 1 2 3)) 2(1 2 3) 3CL-USER> (eval ''(list 1 2 3)) 4(LIST 1 2 3) 5CL-USER> (eval '''(list 1 2 3)) 6'(LIST 1 2 3) 7CL-USER>
長くなりましたが、疑問を要約すると,
EVAL
関数はクオートを付ける必要があるのかないのか、- クオートがなければ解釈に違いがあるのか、
- なぜ
LIST
関数はクオート無しではエラーになるのか
という点です。
よろしくお願いします。
`(eval 6)`を実行すれば1〜2は解決すると思います。
「何時実行するか」がキモになるはずなので。

回答1件
あなたの回答
tips
プレビュー