欢迎!请参阅 关于 页面以获取更多关于其工作方式的信息。
我注意到有几个代码示例使用 clojure.lang.RT/iter 来检索 Clojure 集合的迭代器。
clojure.lang.RT/iter
(iterator-seq (clojure.lang.RT/iter [1 2 3]))
例如。
https://github.com/noprompt/meander/commit/d2310daaa485afb4e15ceda72aa57f97ea90f284
和
https://github.com/wilkerlucio/cljc-misc/blob/bb3c8016cace18db5caa5fe0aa5df7a507935f8d/src/main/com/wsscode/misc/coll.cljc#L262
出于 Babashka 与 Clojure 的兼容性,我想知道是否应该公开 clojure.lang.RT。我并不完全确信应该这样做,因为 clojure.lang.RT 可能是 Clojure 的实现细节。
相反,也许 Clojure 可以将 RT/iter 方法作为 clojure.core 函数公开?
我已经“明白”了本地.m2中使用 clojure.lang.RT 的地方,并排除了 clojure 本身
clojure.lang.RT
[clojure.lang.RT/loadClassForName 15] [clojure.lang.RT/iter 5] [clojure.lang.RT/loadLibrary 4] [clojure.lang.RT/assoc 4] [clojure.lang.RT/classForName 3] [clojure.lang.RT/load 2]
请注意,ClojureScript 有一个 iter 函数
iter
$ plk ClojureScript 1.10.597 cljs.user=> (iter [1 2 3]) #object[cljs.core.RangedIterator] cljs.user=> $ clj Clojure 1.10.1 user=> (iter [1 2 3]) Syntax error compiling at (REPL:1:1). Unable to resolve symbol: iter in this context
我同意 @borkdude 的看法,如果能有一个核心函数来实现这种在语言中常见的需求,这将使其更加便携。
这倒不是什么大问题,但在CLJS中也有transformer-iterator,它通过在一个上应用转换器创建了一个新的迭代器。如果在这个特性上也能保持一致,那就太好了。
transformer-iterator
RT应被视为内部实现,不应直接调用。
迭代器在很大程度上是非Clojure式的。它们有状态,通常不是并发友好的。当Clojure可以在某些其他调用(特别是在转换器上下文中)中约束它们的用法时,它会依赖它们。
(iterator-seq (clojure.lang.RT/iter [1 2 3]))看起来很差,而(seq [1 2 3])在多个方面看起来更好。如果有些用例让人们想要生成迭代器,我对这个问题很感兴趣,但在这里我没有看到。
(seq [1 2 3])