2024年Clojure调查中分享您的想法!

欢迎!有关本网站如何运作的更多信息,请参阅关于页面。

+2
Java Inteproc
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 等函数的结果也永远不能是分块序列,因为它们当前是这样编写的。这里有一大堆问题。

如果上述说法正确,那么最好的回答方案就是去除分块。关键的核心函数可以写得更好,存在 transducers 和 ham-fisted's lazy-noncaching 命名空间,它们都提供了惰性、非缓存的编程模型,这比懒加载缓存线程安全模型更快。
序列序列是分块的...

user> (def data (seq al))
#'user/data
user> (type (seq data))
clojure.lang.ChunkedCons
答案是由map等操作得到的惰性序列。调用此序列上的seq返回一个分块cons(在单集合的情况下),所以(chunked-seq? (map ...))总是为假,但是
(chunked-seq? (seq (map ...)))有时会为真。如果(RT/chunkIteratorSeq ...)实际上返回分块序列会更好。

1 个回答

+1
by

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

...