评论由:devn 提出
首先要讨论的是原始描述中提出的 (empty? (transient ()))
。根据 https://clojure.org/reference/transients 中的文档说明,在列表上支持 transients 不会带来任何好处。
Java 集合的当前行为
`
(empty? (java.util.HashMap. {}))
=> true
(empty? (java.util.HashMap. {1 2}))
=> false
(seq (java.util.HashMap. {1 2}))
=> (#object[java.util.HashMap$Node 0x4335c9c3 "1=2"])
(seq (java.util.HashMap. {}))
=> nil
`
Java 数组也有相同的行为。
在 CLJS-2802 中,当前补丁通过对 empty?
中的问题使用 cond
来处理,并显式检查它是否是 TransientCollection,如果是,使用 (zero? (count coll))
作为原始描述中提到的解决方案作为替代办法。
目前,transient 集合没有像持久集合那样实现 Iterable。如果实现了 Iterable,我相信 RT.seqFrom 将会工作,并且由于扩展,empty?
也会工作。