質問: emacs lisp: consセルと引用符? お世話になります。 emacs lispについて勉強しています 今は、リスト、consセルについて勉強しています。 以下、拙い質問になるかと思いますが、よろしくお願いします。 lisp interactionモードのバッファに、 '(1 2 3) というリストを書いて行末でc-jを押下すると (1 2 3) という式を返します。 しかし、 (1 2 3) という式を書いて行末でc-jを押下すると debugger entered--lisp error: (invalid-function 1) というエラーになります。 これは、1が関数、2と3が引数として評価されるからですね。 さて、リストではなく「consセル」を作るとします。 (1 . 2) と書いてc-jを押下すると、やはり debugger entered--lisp error: (invalid-function 1) というエラーになります。 '(1 . 2) であれば (1 . 2) と、正しくconsセルが出来ます。 '(1 . nil) であれば (1) というリストを返します。 これは、cdr部がnilであるconsセルはリストになるからですね。 では、3と、「1とnilからなるリスト」のconsセルを作って、結果的に(3 1)というリストにしようとします。 '(3 . '(1 . nil)) この場合は、予想に反して (3 quote (1)) となります。 '(3 . (1 . nil)) であれば、 (3 1) となります。一方、 (3 . (1 . nil)) とすると、 debugger entered--lisp error: (invalid-function 3) となります。 まとめると、 3と、「1とnilからなるリスト」のconsセルを作って、結果的に(3 1)というリストにしようとした場合は、 '(3 . (1 . nil)) のように外側のconsセルはクォートし、内側のconsセルはクォートしない、ということになりますね。 このクォートの振る舞いの違いはなぜでしょうか。 よろしくお願いします。
回答: 単純に言えば、quote は渡された引数をすべて(あなたの言葉を使えば)「関数扱い」しないからです。 すなわち、 '('x) = (quote (quote x)) を評価すると単に (quote x) になります。 おそらくあなたは、普通の関数から類推して(例えば (+ (* 2 3) 1) = (+ 6 1) = 7 のように) quote の引数も評価されると思われたのでしょうが、 quote は関数ではなく特殊形式と呼ばれるもので、内側の関数を(当然、特殊形式も)評価しません。