Clojure核心中的哪些功能可以保留元数据?

时间:2011-01-12 19:17:48

标签: clojure meta

只有在函数注意这样做并且Clojure核心函数不全局保留元时,才会保留Clojure元。我听说的一般经验法则是像conj,assoc等集合函数应该保留元,但是map,filter,take等序列函数不保留元。

是否存在哪些函数保留元的列表?

1 个答案:

答案 0 :(得分:5)

所有关于类型。序列函数就像它们在参数上调用seq一样,因此并不总是返回相同类型的对象。集合函数和特定于类型的函数不会调用seq并返回与给定的对象类型相同的对象。这有点让他们给出了返回同一个对象的幻觉(这可能就是这种行为的推理),即使事实并非如此。我们可以说经验法则是函数在保留类型时保留元。

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

一定要注意懒惰是否很困难:

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

有关保留元集合的函数列表,请参阅data structures页面。不保留meta的那些是在sequences页面下,除了它们返回相同类型的对象时。

由于添加了懒惰和分块序列,我不太确定细节,但您可以查看consseqseqFrom方法。 RT课程。不保留元数据的函数通过这些方法。虽然集合函数最终使用特定于其类型的方法。