2010-10-09 5 views
28

Aus der Lektüre einführendes Material auf Lisp, halte ich jetzt die identisch sind folgende:In Lisp (Clojure, Emacs Lisp), was ist der Unterschied zwischen Liste und Zitat?

(list 1 2 3) 

'(1 2 3) 

jedoch von den Problemen zu urteilen, ich konfrontiert werden, wenn die zitierte Form sowohl in Clojure und Emacs Lisp verwenden, sie sind nicht die gleich. Kannst du mir sagen, was der Unterschied ist?

+0

Sie sind in der Tat einen Blick auf meine Frage ähnlich beenden [hier] (http://stackoverflow.com/questions/32927115/lisp-quote-work-internally?noredirect = 1 # comment53680808_32927115) – William

Antwort

9

Angegebene Listen (z. B. '(1 2 3)) sollten sorgfältig behandelt werden (allgemein als schreibgeschützt). (siehe SO Antworten When to use 'quote in Lisp und When to use 'quote in Lisp).

(list 1 2 3) wird "cons" eine neue Liste, unabhängig von allen anderen.

Sie können ein Beispiel für einen Fehler bei der Verwendung von Listen in der manual for nconc.

Und wie Sie wahrscheinlich wissen, wenn Sie 'list aufrufen - die Argumente werden offensichtlich gegen den Inhalt einer zitierten Liste ausgewertet werden. Und 'quote nimmt ein einzelnes Argument entgegen 'list s Variable Anzahl der Argumente.

(list (+ 1 2) 3)  --> (3 3) 
(quote ((+ 1 2) 3)) --> ((+ 1 2) 3) 
+1

Ich mochte, dass Sie den Unterschied zwischen ihren "Signaturen", die Anzahl der Argumente hingewiesen. –

8

In Common Lisp sind in Anführungszeichen gesetzte Objekte konstante Literaldaten. Sie sollten diese Daten nicht ändern, da die Konsequenzen nicht definiert sind. Mögliche Folgen sind: Änderung von gemeinsam genutzten Daten, Versuch Nur-Lese-Daten zu ändern, könnte ein Fehler gemeldet werden, es könnte funktionieren, ...

Für Listen:

'(1 2 3) 

Oben ist eine Konstante Liste , die vom Leser konstruiert und zu sich selbst ausgewertet werden, weil es zitiert wird. Wenn es in Lisp-Code erscheint, wird ein Compiler diese Daten irgendwie in den FASL-Code einbetten.

(quote (1 2 3)) ist eine andere Möglichkeit, es zu schreiben.

(list 1 2 3) 

dies ist ein Aufruf der Common Lisp Funktion LIST mit drei Argumenten 1, 2 und 3. Bei Auswertung ist das Ergebnis eine neue Liste (1 2 3).

Ähnliche:

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

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

One ist die wörtliche Daten und der andere ist ein Funktionsaufruf, der eine solche Datenstruktur konstruiert.

34

Der Hauptunterschied besteht darin, dass quote Auswertung der Elemente verhindert, während list nicht:

 
user=> '(1 2 (+ 1 2)) 
(1 2 (+ 1 2)) 
user=> (list 1 2 (+ 1 2)) 
(1 2 3) 

Aus diesem Grund (unter anderen), ist es idiomatische clojure einen Vektor zu verwenden, wenn ein Literal Sammlung beschreiben, :

 
user=> [1 2 (+ 1 2)] 
[1 2 3] 
+0

Diese Antwort erscheint unehrlich, da sie nicht erwähnt, dass '(Liste 1 2 '(+ 1 2))' immer noch eine Liste ist, aber das dritte Element nicht ausgewertet wird, aber nicht den Unterschied zwischen' '(1 2 (+ 1 2)) 'und' (Liste '1' 2 '(+ 1 2)) ' – Dmitry