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

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

如果上述内容是真实的,那么最好的答案是移除chunking。核心函数可以写得更好,有transducers和ham-fisted的lazy-noncaching命名空间,它们都提供了一个比lazy-caching-threadsafe更快的惰性非缓存编程模型。
seq的seq是chunked...

user> (def data (seq al))
#'user/data
user> (type (seq data))
clojure.lang.ChunkedCons
答案是映射等的结果是惰性序列。调用seq对这些序列会返回块cons(在单集合的情况下),因此无论何时chunked-seq? (map ...) 总是返回false,但是
(chunked-seq? (seq (map ...)))有时会返回true。如果(RT/chunkIteratorSeq ...)实际上返回一个块序列将是非常理想的。

1 个回答

+1

已创建CLJ-2821 来跟踪该问题。

...