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

Ale*_*ler 8 meta clojure

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

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

Nic*_*roi 5

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

user> (meta (seq (with-meta (list 1) {:a 1})))
{:a 1}
user> (meta (seq (with-meta (vector 1) {:a 1})))
nil
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

有关在集合中保留元的函数列表,请参阅数据结构页面.不保留元的那些是在序列页面下,除了它们返回相同类型的对象时.

引擎盖下,我不是很肯定,因为懒惰的细节和分块序列已被添加,但你可以看看cons,seqseqFrom从方法RT类.不保留元数据的函数通过这些方法.虽然集合函数最终使用特定于其类型的方法.