【问题标题】:Does Clojure's 'into' hold on to head?Clojure 是否“坚持”?
【发布时间】:2015-08-05 16:26:23
【问题描述】:

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

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

【问题讨论】:

    标签: clojure seq


    【解决方案1】:

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

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

    更准确的证明是检查the source 是否有into,我们发现这只是对reduce 的一个花哨的调用:

    (defn into
      ([to from]
         ;...
           (reduce conj to from)))
    

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

    【讨论】:

      【解决方案2】:

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

      (source into)
      

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

      【讨论】:

        猜你喜欢
        • 2011-02-11
        • 2020-05-05
        • 2016-05-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多