2010-10-09 13 views
28

De la lectura de material introductorio en Lisp, ahora considero que los siguientes son idénticos:En Lisp (Clojure, Emacs Lisp), ¿cuál es la diferencia entre la lista y la cita?

(list 1 2 3) 

'(1 2 3) 

Sin embargo, a juzgar por los problemas que enfrento al utilizar el formulario citado en tanto Clojure y Emacs Lisp, que son no la mismo. ¿Puedes decirme cuál es la diferencia?

+0

se dejan similares, de hecho, echar un vistazo a mi pregunta [aquí] (http://stackoverflow.com/questions/32927115/lisp-quote-work-internally?noredirect = 1 # comment53680808_32927115) – William

Respuesta

9

Las listas de citas (por ejemplo, '(1 2 3)) se deben tratar con cuidado (generalmente como de solo lectura). (ver respuestas de SO When to use 'quote in Lisp y When to use 'quote in Lisp).

(list 1 2 3) "cons" hasta una nueva lista, independiente de todos los demás.

Puede ver un ejemplo de una trampa de usar listas citadas en el manual for nconc.

Y, como probablemente sepa, cuando llama al 'list - obviamente los argumentos se evaluarán en comparación con los contenidos de una lista citada. Y 'quote toma un solo argumento, en comparación con el número variable de argumentos de 'list.

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

Me gustó que señalaras la diferencia entre sus "firmas", el número de argumentos. –

8

En Common Lisp, los objetos entre comillas son datos literales constantes. No debe modificar estos datos, ya que las consecuencias no están definidas. Las posibles consecuencias son: modificación de los datos compartidos, intento de modificar datos de sólo lectura, un error podría ser señalizado, que sólo podría trabajar, ...

Para listas:

'(1 2 3) 

Por encima es una lista constante , que será construido por el lector y evaluándose a sí mismo, porque está citado. Si aparece en el código Lisp, un compilador integrará estos datos de alguna manera en el código FASL.

(quote (1 2 3)) es otra manera de escribirlo.

(list 1 2 3) 

Ésta es una llamada de la función Common Lisp LIST con tres argumentos 1, 2 y 3. Cuando se evalúa, el resultado es una nueva lista (1 2 3).

similares:

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

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

Uno de ellos es los datos literales y el otro es una llamada de función que construye una estructura de este tipo de datos.

34

La principal diferencia es que quote evita la evaluación de los elementos, mientras que list no:

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

Por esta razón (entre otros), es clojure idiomática usar un vector cuando se describe una colección literal :

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

esta respuesta parece deshonesta, ya que no menciona que '(list 1 2 '(+ 1 2))' sigue siendo una lista, pero el tercer elemento no se evalúa, pero no expresa la diferencia entre '' (1 2 (+ 1 2)) 'y' (lista '1' 2 '(+ 1 2)) ' – Dmitry

Cuestiones relacionadas