2024 Clojure 状态调查! 中分享您的想法。

欢迎!请查看 关于页面 了解更多关于其工作方式的信息。

+2
头像 Java Interop
user> (def al (hamf/array-list (range 200))) 
#'user/al
user> (type al)
java.util.ArrayList
user> (chunked-seq? (seq al))
false
user> (instance? java.lang.Iterable al)
trueSyntax error reading source at (REPL:65:41).
Unmatched delimiter: )
user> (instance? java.lang.Iterable al)
true
user> (chunked-seq? (clojure.lang.RT/seq al))
false
user> (chunked-seq? (clojure.lang.RT/chunkIteratorSeq (.iterator al)))
false
user> (type (clojure.lang.RT/chunkIteratorSeq (.iterator al)))
clojure.lang.LazySeq

如果没有惰性序列是分块序列,那么 clojure.core/map、filter 等函数的结果也永远不能是分块序列,因为它们当前是这样写的。这里有很多问题。

 by
如果以上成立,那么最好的回答就是移除分块。相关性函数可以写得更好,有转换器和 ham-fisted's lazy-noncaching 命名空间,它们都提供了更快的惰性非缓存编程模型,这比 lazy-caching-threadsafe 快。
头像 by
序列的序列是分块的...

用户> (def 数据 (序列 al))
用户/数据
用户> (类型 (序列 数据))
clojure.lang.ChunkedCons
头像 by
答案是通过映射等操作得到的结果,是一个懒序列。对序列进行seq操作返回的是一个分块合并的结果(在单集合的情况下),所以 (chunked-seq? (map ...)) 总是返回false,但是
(chunked-seq? (seq (map ...))) 有时会返回true。如果 (RT/chunkIteratorSeq ...) 能够返回一个分块序列,那将很理想。

1 个答案

+1

创建了CLJ-2821来跟踪这个问题。

...