Welche Funktionen in Clojure Kern meta bewahren?
Frage
Clojure meta wird nur erhalten, wenn eine Funktion dafür sorgt, so zu tun und die Clojure Kernfunktionen meta nicht global bewahren. Die Faustregel ich gehört habe, ist, dass die Sammelfunktionen wie Konj, assoc, etc. sollen meta aber Sequenzfunktionen wie Karte erhalten, Filter, nehmen usw. nicht meta erhalten.
Gibt es eine Liste irgendwo, was Funktionen Meta bewahren tun?
Lösung
Es ist alles über die Arten. Sequenzfunktionen handeln, wie sie seq
auf ihr Argument nennen und damit nicht immer die gleiche Art von Objekt zurück. Sammelfunktionen und typspezifische Funktionen aufrufen nicht seq und zurück ein Objekt des gleichen Typs wie das, was wurde ihnen gegeben. Es Art macht sie die Illusion des gleiche Objekt zurückzukehr (dies könnte die Begründung für dieses Verhalten sein), auch wenn das ist wirklich nicht der Fall. Wir könnten sagen, dass die Faustregel, dass eine Funktion, die Meta bewahren, wenn es die Art erhalten.
user> (meta (seq (with-meta (list 1) {:a 1})))
{:a 1}
user> (meta (seq (with-meta (vector 1) {:a 1})))
nil
Achten Sie darauf, sich bewusst sein, wenn Faulheit beteiligt ist hart:
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
Für eine Liste von Funktionen, die Meta-Konserven auf Sammlung finden Sie in den Datenstrukturen Seite . Die, die nicht meta Erhaltung sind unter Sequenzen Seite, mit Ausnahme, wenn sie ein Objekt des gleichen Typs zurück.
Unter der Haube Ich bin nicht ganz sicher über die Details, da Faulheit und Chunked Sequenz hinzugefügt wurden, aber Sie können an den cons
aussehen, seq
und seqFrom
Methoden aus der RT
Klasse. Die Funktionen nicht Meta-Daten zu bewahren gehen durch diese Methoden. Während die Sammelfunktionen Methoden, die auf ihre Art am Ende mit.