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!
Voulez-vous dire "Quote Confujon"? – pablosaraiva