只有在函数注意这样做并且clojure核心功能不保留元元时,才能保留clojure meta。我听到的一般经验法则是,诸如conj,coosed等的收集函数应该保留元数据,但是诸如MAP,FILFER,TAKE等的序列函数不能保留元。

是否有保留元的功能的列表?

有帮助吗?

解决方案

都是关于类型的。序列函数的作用就像他们称之为 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

有关保留元收集元的功能列表,请参阅 数据结构 页。那些不保留元的人在 序列 页面,除了何时返回同一类型的对象时。

在引擎盖下,我不太确定细节,因为已经添加了懒惰和块状序列,但是您可以看一下 cons, seqseqFrom 来自 RT 班级。没有保留元数据的功能通过这些方法。尽管收集功能最终使用特定类型的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top