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

欢迎!请在关于 页面上了解更多这个网站的信息。

+2
Java 互操作
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的lazy-noncaching命名空间,它们都提供了比lazy-caching-threadsafe更快的惰性、非缓存编程模型。
序列的序列是分块的...

user> (def data (seq al))
#'user/data
user> (type (seq data))
clojure.lang.ChunkedCons
答案是map等的延迟序列。对序列调用seq将返回一个分块的cons(在单一集合的情况下),因此(chunked-seq? (map ...)) 总是会返回false,但
(chunked-seq? (seq (map ...)))有时会返回true。如果(RT/chunkIteratorSeq ...)确实返回一个分块序列,那就更完美了。

1 答案

+1投票

已创建CLJ-2821 以跟踪此问题。

...