【问题标题】:a version of `sequence` that doesn't do chunking不进行分块的“序列”版本
【发布时间】:2020-12-08 10:16:33
【问题描述】:

我想要一个不分块 32 个元素的 sequence 版本。目前,此代码将输出

(def peek #(doto % (print " ")))
(def pause #(do (Thread/sleep 10)
                %))

(take 2 (->> (range 100)
             (sequence (comp (map peek)
                             (map pause)
                             (map inc)))))

;; prints 0 1 2 3 4 <..etc..> 32
;; => (0, 1)

我想要它的一个版本,以便它只遍历它需要的元素

(take 2 (->> (range 100)
             (iter-sequence  (comp (map peek)
                             (map pause)
                             (map inc)))))

;; prints 0 1
;; => (0, 1)

有没有办法做到这一点?

【问题讨论】:

  • 我猜它有一些事情要做iterate,但我也希望能够在它上面使用传感器。
  • stackoverflow.com/questions/12412038/… - 特别是选择者的回应。
  • @cfrick - 这就是重点。我不想那样做。
  • @stefan。这不起作用,因为它仍然会生成一个序列。我希望它生成一个迭代器(就像序列一样)但不是分块版本。
  • @cfrick 如果将take 2 替换为first,它会打印32 个元素,因此罪魁祸首肯定是序列。

标签: clojure


【解决方案1】:

我必须更改一些东西才能使其正常工作。第一种是剪切和粘贴sequence 代码并将clojure.lang.RT/chunkIteratorSeq 替换为具有公开构造函数方法的clojure.lang.IteratorSeq 的替代版本。

原因是clojure.lang.IteratorSeq/create 对 L27 上的 iter.next() 进行了检查,如果源阻塞,它将阻塞。

(defn seqiter
  {:added "1.0"
   :static true}
  ([coll] coll)
  ([xform coll]
   (IteratorSeq.
    (TransformerIterator/create xform (clojure.lang.RT/iter coll))))
  ([xform coll & colls]
   (IteratorSeq.
    (TransformerIterator/createMulti
     xform
     (map #(clojure.lang.RT/iter %) (cons coll colls))))))

【讨论】:

猜你喜欢
  • 2012-01-31
  • 2010-10-05
  • 2017-05-28
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多