2011-03-20 5 views
3

Pourquoi cette série de commandes clojure renvoie-t-elle faux et non vrai? Quelle est la différence entre le résultat de l'énoncé 1 "C" et 2 "(citation C)"?Citation de confusion

; SLIME 2009-03-04 
user> ('A 'B 'C) 
C 
user> (last '('A 'B 'C)) 
(quote C) 
user> (= ('A 'B 'C) (last '('A 'B 'C))) 
false 

Cette question est un peu similaire à How does clojure's syntax-quote work?

+0

Voulez-vous dire "Quote Confujon"? – pablosaraiva

Répondre

7

En Clojure (et d'autres Lisps) le ' est un raccourci pour la forme (quote ...). Alors, quand Clojure voit ceci:

('A 'B 'C) 

qui est « traduit » par le lecteur dans:

((quote A) (quote B) (quote C)) 

Chacune de ces formulaires de soumission est évaluée à un symbole, si (quote A) évalue le symbole nommé A. Dans Clojure, les symboles sont des fonctions et peuvent être appliqués, donc ((quote A) (quote B) (quote C)) est en fait un appel de fonction. De la documentation:

"Les symboles, tout comme les mots-clés, implémentent IFn pour invoke() d'un argument (une carte) avec un deuxième argument optionnel (une valeur par défaut), par exemple ('mysym my-hash-map: none) signifie la même chose que (get my-hash-map 'mysym: none). "

Donc, ce qui se passe est que C est la valeur par défaut et c'est pourquoi il est retourné.

Pendant ce temps, ce

'('A 'B 'C) 

se traduit par le lecteur dans

(quote ((quote A) (quote B) (quote C))) 

Ce qui est en fait une liste de trois éléments, dont chacun est une liste de deux éléments, le symbole quote et un autre symbole (dans ce cas A, B, C). Par conséquent, (last '('A 'B 'C)) est actuellement (quote C). C'est la différence entre ces deux résultats, C est le symbole avec le nom C tandis que (quote C) est une liste de deux éléments.

Vous pouvez confirmer:

user=> (class ('A 'B 'C)) 
clojure.lang.Symbol 
user=> (class (last '('A 'B 'C))) 
clojure.lang.PersistentList 
user=> 

Espoir qui est clair!

+0

Merci pour votre aide – tjb

+0

De rien! – spacemanaki

1

('x' y) est très inhabituel, pour cette seule raison. Habituellement, vous voulez '(x y), qui est une liste des symboles littéraux x et y. Si vous citez DEUX FOIS avec '(' x 'y), vous obtiendrez une liste avec (quote x) à la place: la citation du symbole littéral, suivie du symbole littéral x.