问题描述
我想要一个sequence
的版本,它不对32个元素进行分块。目前,此代码将输出
(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)
有没有办法做到这一点?
解决方法
为了使它正常工作,我不得不更改几件事。首先是剪切并粘贴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))))))