Question

Clojure méta ne se conserve que si une fonction prend soin de le faire et les fonctions essentielles Clojure ne préservent pas globalement méta. La règle générale, je l'ai entendu est que les fonctions de collecte comme conj, assoc, etc sont censés préserver les méta mais les fonctions séquence comme carte, filtre, prendre, etc ne conserve pas meta.

Y at-il une part de la liste de ce que les fonctions ne conservent méta?

Était-ce utile?

La solution

Il est tout au sujet des types. fonctions de séquence agissent comme ils appellent seq leur argumentation et donc ne retourne pas toujours le même type d'objet. fonctions de collecte et de fonctions spécifiques de type ne remet pas et suivants renvoient un objet du même type que ce qui leur a été donné. Ce genre de faire de leur donner l'illusion de retourner le même objet (cela pourrait être le raisonnement de ce comportement), même si c'est vraiment pas le cas. On pourrait dire que la règle de base est que les fonctions conservent une méta quand il préserve le type.

user> (meta (seq (with-meta (list 1) {:a 1})))
{:a 1}
user> (meta (seq (with-meta (vector 1) {:a 1})))
nil

Assurez-vous d'être au courant quand la paresse est impliqué difficile:

user> (type (list 1))
clojure.lang.PersistentList
user> (type (map identity (list 1)))
clojure.lang.LazySeq
user> (meta (seq (with-meta (map identity (list 1)) {:a 1})))
nil

Pour une liste des fonctions qui préserve méta sur la collecte, voir les structures de données de page . Ceux ne sont sous méta préserver la page , à l'exception du moment où ils retournent un objet du même type.

Sous le capot, je ne suis pas tout à fait sûr des détails depuis la paresse et la séquence Chunked a été ajouté, mais vous pouvez regarder les méthodes cons, seq et seqFrom de la classe RT. Les fonctions ne méta-données de conservation passent par ces méthodes. Alors que les fonctions de collecte finissent en utilisant des méthodes spécifiques à leurs types.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top