欢迎!有关本网站如何运作的更多信息,请参阅 关于 页面。
我看到了几个使用 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,它可以通过应用transducer来创建一个新的迭代器。如果在这个功能上也能与之前保持一致就好了。
transformer-iterator
RT应该被视为内部实现,不应直接调用。
迭代器一般来说不太像Clojure风格。它们具有状态,通常不兼容并发。当Clojure可以限制其在某些调用中的使用(特别是transducer上下文)时,它会依赖它们。
使用`(iterator-seq (clojure.lang.RT/iter [1 2 3]))`似乎不好,而使用`(seq [1 2 3])`在多个方面似乎更好。如果有某些用例使得人们想要使用迭代器,我对这个问题很感兴趣,但在这里我没有看到。