32

Lispの紹介資料を読んだことから、私は次のことを同じだと考えています。

(list 1 2 3)

'(1 2 3)

ただし、ClojureとEmacs Lispの両方で引用形式を使用するときに直面する問題から判断すると、それらは同じではありません。違いを教えてください。

4

4 に答える 4

37

主な違いはquote、要素の評価を妨げることですが、そうではありlist ません。

user =>'(1 2(+ 1 2))
(1 2(+ 1 2))
user =>(リスト1 2(+ 1 2))
(1 2 3)

このため(とりわけ)、リテラルコレクションを記述するときにベクトルを使用するのは慣用的なclojureです。

user => [1 2(+ 1 2)]
[1 2 3]
于 2010-10-09T19:38:52.203 に答える
11

引用符で囲まれたリスト(例'(1 2 3))は、慎重に扱う必要があります(通常は読み取り専用として)。(SOの回答「Lispで引用符を使用する場合」および「Lispで引用符を使用する場合」を参照してください)。

(list 1 2 3)他のすべてから独立して、新しいリストを「短所」にします。

のマニュアルでnconc引用リストを使用する際の落とし穴の例を見ることができます。

そして、おそらくご存知のように、呼び出すと'list、引数は引用符で囲まれたリストの内容に対して明らかに評価されます。そして、引数の数が可変であるの'quoteに対して、単一の引数を取ります。'list

(list (+ 1 2) 3)     -->  (3 3)
(quote ((+ 1 2) 3))  -->  ((+ 1 2) 3)
于 2010-10-09T08:23:53.773 に答える
11

Common Lispでは、引用符で囲まれたオブジェクトは定数リテラルデータです。結果は未定義であるため、このデータを変更しないでください。考えられる結果は次のとおりです。共有データの変更、読み取り専用データの変更の試行、エラーの通知、正常に機能する可能性、...

リストの場合:

'(1 2 3)

上記は定数リストであり、引用されているため、読者が作成し、それ自体を評価します。Lispコードに表示される場合、コンパイラはこのデータを何らかの方法でFASLコードに埋め込みます。

(quote (1 2 3))それを書く別の方法です。

(list 1 2 3)

LISTこれは、 3つの引数12を使用したCommonLisp関数の呼び出しです3。評価すると、結果は新しいリストになり(1 2 3)ます。

似ている:

'(1 . 2)   and  (cons 1 2)

'#(1 2 3)  and  (vector 1 2 3)

1つはリテラルデータで、もう1つはそのようなデータ構造を構築する関数呼び出しです。

于 2010-10-09T17:04:15.073 に答える
0

それらの関係は、「関数名」と「。」を使用した関数呼び出しに類似している可能性がありfuncallます。

実行時にどの関数を取得するかわからない場合は、を使用しますfuncall

実行時にどの要素を取得できるかわからない場合は、を使用しますlist


私のように存在のために混乱し、backquote暗黙のうちに引用として数える人々のために。

backquoteではありませんquote

quoteこれは、、listまたはその他に展開されるリーダーマクロです。

(macroexpand ''(1 2));=> '(1 2)
(macroexpand '`(1 2));=> '(1 2)
(macroexpand '`(1 ,2));=> (list 1 2)
(macroexpand '`(1 ,@foo));=> (cons 1 foo)
(macroexpand '`(1 ,@foo 2));=> (cons 1 (append foo '(2)))
于 2021-01-22T12:08:59.377 に答える