Pregunta

Clojure meta solamente se conserva si una función se encarga de hacerlo y las funciones básicas de Clojure no a nivel mundial preservar meta. La regla general que he escuchado es que las funciones de recolección como conj, asoc, etc se supone preservar meta, pero la secuencia funciona como un mapa, filtro, toma, etc no conservan meta.

¿Hay una lista en alguna parte de lo que hacen las funciones conservan meta?

¿Fue útil?

Solución

Se trata de los tipos. Las funciones de secuencia actúan como ellos llaman seq en su argumento y por lo tanto no siempre devuelve el mismo tipo de objeto. las funciones de recogida y funciones específicas de tipo no llama a la SEC y devuelven un objeto del mismo tipo que lo que fue dado a ellos. Como que los hacen dar la ilusión de devolver el mismo objeto (esto podría ser la razón para este comportamiento), incluso si eso no es realmente el caso. Podríamos decir que la regla de oro es que funciona un preservan la meta cuando se conserva el tipo.

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

Asegúrese de tener en cuenta cuando la pereza está implicada 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

Para obtener una lista de las funciones que conserva meta en la recopilación, consulte la página de las estructuras de datos . Los que no preservan meta están bajo el href="http://clojure.org/sequences" rel="noreferrer"> secuencias página , con la excepción de cuando vuelven un objeto del mismo tipo.

Bajo el capó no estoy muy seguro acerca de los detalles ya que se ha añadido la pereza y la secuencia fragmentada, pero se puede ver en las cons, seq y seqFrom métodos de la clase RT. Las funciones no preservan los meta-datos pasan a través de estos métodos. Mientras que las funciones de recogida terminan usando métodos específicos para sus tipos.

scroll top