欢迎!请查阅 关于 页面以获取有关该系统更多信息。
我见过几次使用 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])`在多个方面看起来更好。如果有某种用法驱使人们想要创建迭代器,我对这个问题很感兴趣,但我没有在这里看到这种情况。