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

欢迎!请参阅 关于 页面了解更多关于此如何运作的信息。

+2
in Java Interop by
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 的 lazy-noncaching 命名空间,它们都提供懒、非缓存编程模型,这比 lazy-caching-threadsafe 要快。
by
序列的序列是分块的...

user> (def data (seq al))
#'user/data
user> (type (seq data))
clojure.lang.ChunkedCons
by
该答案是对map等产生的结果,是一个惰性序列。在对这个序列调用seq时返回一个chunkedcons(在单集合情况下),所以(chunked-seq? (map ...))总是为false,但是
(chunked-seq? (seq (map ...)))有时会为true。如果(RT/chunkIteratorSeq ...)确实返回一个chunked seq,那就更理想了。

1 答案

+1 投票
by

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

...