2010-10-09 16 views
28

Dalla lettura materiale introduttivo sul Lisp, ora considerare i seguenti identici:In Lisp (Clojure, Emacs Lisp), qual è la differenza tra lista e preventivo?

(list 1 2 3) 

'(1 2 3) 

Tuttavia, a giudicare dai problemi che incontro quando si utilizza il modulo citato sia Clojure ed Emacs Lisp, sono non la stesso. Puoi dirmi qual è la differenza?

+0

sono smettere simile, infatti, dare un'occhiata alla mia domanda [qui] (http://stackoverflow.com/questions/32927115/lisp-quote-work-internally?noredirect = 1 # comment53680808_32927115) – William

risposta

9

Gli elenchi quotati (ad esempio '(1 2 3)) devono essere trattati con attenzione (generalmente in sola lettura). (vedi SO risponde allo When to use 'quote in Lisp e allo When to use 'quote in Lisp).

(list 1 2 3) "cons" una nuova lista, indipendente da tutti gli altri.

È possibile visualizzare un esempio di una trappola dell'utilizzo di elenchi quotati in manual for nconc.

E, come probabilmente sapete, quando si chiama 'list - gli argomenti saranno ovviamente valutati rispetto al contenuto di un elenco quotato. E 'quote accetta un singolo argomento, rispetto al numero variabile di argomenti 'list s.

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

Mi è piaciuto che tu indicassi la differenza tra le loro "firme", il numero di argomenti. –

8

In Common Lisp, gli oggetti quotati sono dati letterali costanti. Non dovresti modificare questi dati, poiché le conseguenze sono indefinite. Possibili conseguenze sono: modifica dei dati condivisi, il tentativo di modificare i dati di sola lettura, un errore potrebbe essere segnalato, potrebbe solo lavoro, ...

Per le liste:

'(1 2 3) 

Sopra è un elenco costante , che sarà costruito dal lettore e valutando se stesso, perché è citato. Se appare nel codice Lisp, un compilatore incorporerà questi dati in qualche modo nel codice FASL.

(quote (1 2 3)) è un altro modo per scriverlo.

(list 1 2 3) 

questa è una chiamata della funzione Common Lisp LIST con tre argomenti 1, 2 e 3. Quando viene valutato, il risultato è una nuova lista fresca (1 2 3).

simili:

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

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

Uno è i dati letterali e l'altro è una chiamata di funzione che costruisce una struttura di dati.

34

La differenza principale è che quote impedisce valutazione degli elementi, mentre list non lo fa:

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

Per questo motivo (tra gli altri), è clojure idiomatica utilizzare un vettore per descrivere una collezione letterale :

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

questa risposta sembra disonesta in quanto non dice che '(lista 1 2 '(+ 1 2))' è ancora una lista ma il terzo elemento non viene valutato ma non esprime la differenza tra '' (1 2 (+ 1 2)) 'e' (lista '1' 2 '(+ 1 2)) ' – Dmitry

Problemi correlati