2010-10-09 10 views
28

À la lecture de documents d'introduction sur Lisp, je considère maintenant les suivantes identiques:En Lisp (Clojure, Emacs Lisp), quelle est la différence entre une liste et une citation?

(list 1 2 3) 

'(1 2 3) 

Cependant, à en juger des problèmes que je rencontre lors de l'utilisation de la forme citée dans les deux Clojure et Emacs Lisp, ils sont pas la même. Pouvez-vous me dire quelle est la différence?

+0

Ils sont en fait quitter la même jeter un oeil à ma question [ici] (http://stackoverflow.com/questions/32927115/lisp-quote-work-internally?noredirect = 1 # comment53680808_32927115) – William

Répondre

9

Les listes citées (par exemple '(1 2 3)) doivent être traitées avec soin (généralement en lecture seule). (voir SO réponses When to use 'quote in Lisp et When to use 'quote in Lisp).

(list 1 2 3) va "contre" une nouvelle liste, indépendante de toutes les autres.

Vous pouvez voir un exemple d'un piège de l'utilisation de listes entre guillemets dans manual for nconc. Et, comme vous le savez probablement, lorsque vous appelez 'list - les arguments seront évidemment évalués par rapport au contenu d'une liste entre guillemets. Et 'quote prend un seul argument, par rapport à 'list nombre variable d'arguments.

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

J'ai aimé que vous avez souligné la différence entre leurs "signatures", le nombre d'arguments. –

8

En Common Lisp, les objets entre guillemets sont des données littérales constantes. Vous ne devez pas modifier ces données, car les conséquences ne sont pas définies. Conséquences possibles sont les suivants: modification des données partagées, essayez de modifier les données en lecture seule, une erreur peut être signalé, il pourrait fonctionner ...

Pour les listes:

'(1 2 3) 

Au-dessus est une liste constante , qui sera construit par le lecteur et évaluant à lui-même, parce qu'il est cité. S'il apparaît dans le code Lisp, un compilateur intégrera ces données d'une manière ou d'une autre dans le code FASL.

(quote (1 2 3)) est une autre façon de l'écrire.

(list 1 2 3) 

ceci est un appel de la fonction Common Lisp LIST avec trois arguments 1, 2 et 3. Une fois évalué le résultat est une nouvelle liste fraîche (1 2 3).

similaires:

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

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

On est les données littérales et l'autre est un appel de fonction qui construit une telle structure de données.

34

La principale différence est que quote empêche l'évaluation des éléments, alors que list ne compte pas:

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

Pour cette raison (entre autres), il est idiomatiques clojure d'utiliser un vecteur pour décrire une collection littérale :

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

cette réponse semble malhonnête car elle ne mentionne pas que '(list 1 2 '(+ 1 2))' est toujours une liste mais le troisième élément n'est pas évalué mais n'exprime pas la différence entre '' (1 2 (+ 1 2)) 'et' (liste '1' 2 '(+ 1 2)) ' – Dmitry

Questions connexes