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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top