Clojure 的 'into' 是否保持领先?

Does Clojure's 'into' hold on to head?

我有一个非常大的惰性序列,我想将它转换成一个集合。我知道序列中不同元素的数量很少,所以我可以轻松地将集合装入内存。但是,我可能无法将整个惰性序列装入内存。我只想做 (into #{} my-lazy-seq),但我突然想到,根据 into 的实现方式,这可能会立即将整个 seq 拉入内存。

into 会在运行时保持序列的头部吗?

我没有看到任何增加的使用量运行这(需要一分钟左右)

user=> (into #{} (take 1e8 (cycle [:foo :bar])))
#{:bar :foo}

更精确的证明是检查 the source 是否有 into,我们看到它只是对 reduce:

的奇特调用
(defn into
  ([to from]
     ;...
       (reduce conj to from)))

如果 reduce 抓住了头,那么 into 就抓住了。但我认为 reduce 不会那样做。

补充@progo的答案,你可以随时使用

(source into)

查看repl中into的源码。这可以节省您在加长的 core.clj.

中查找行的时间