Domanda

Clojure meta è conservato solo se una funzione provvede a farlo e le funzioni principali Clojure non conserva globalmente meta. La regola generale che ho sentito è che le funzioni di raccolta come conj, assoc, ecc si suppone per preservare le funzioni di meta ma di sequenza come mappa, filtro, prendere, ecc non conservare meta.

Esiste un elenco da qualche parte di ciò che funzioni non preservano meta?

È stato utile?

Soluzione

E 'tutto sui tipi. funzioni esecutive comportano come chiamano seq sul loro argomento e pertanto non restituisce sempre lo stesso tipo di oggetto. funzioni di raccolta e funzioni tipo-specifici non sequenza chiamata e restituiscono un oggetto dello stesso tipo come quello che è stato dato loro. E 'sorta di farli dare l'illusione di tornare lo stesso oggetto (questo potrebbe essere il ragionamento per questo comportamento), anche se questo non è davvero il caso. Potremmo dire che la regola generale è che un funzioni conservano la meta quando si conserva il tipo.

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

Assicurati di essere a conoscenza di quando la pigrizia è coinvolto dura:

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

Per un elenco di funzioni che conserva meta sulla raccolta, vedere pagina le strutture dati . Quelli non conservazione meta sono protette dal href="http://clojure.org/sequences" rel="noreferrer"> sequenze pagina , con l'eccezione di quando ritornano un oggetto dello stesso tipo.

Sotto il cofano io non sono molto sicuro circa i dettagli da allora è stato aggiunto la pigrizia e la sequenza Chunked, ma si può guardare ai cons, seq e seqFrom metodi dalla classe RT. Le funzioni non conservazione meta-dati passano attraverso questi metodi. Mentre le funzioni di raccolta finiscono con metodi specifici per i loro tipi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top