欢迎!请参阅 关于 页面了解有关操作的一些更多信息。
我已经看到一些代码使用 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有机会限制它们的用途(特别是transducer上下文中的用途)时,它会依赖于它们。
`(iterator-seq (clojure.lang.RT/iter [1 2 3]))`看起来很糟糕,而`(seq [1 2 3])`在几个方面看起来更好。如果有某种用例使得人们想制作迭代器,我对那个问题感兴趣,但在这里没有看到。