我想做的就是跟随。
(def mystream (stream (range 100)))
(take 3 mystream)
;=> (0 1 2)
(take 3 mystream)
;=> (3 4 5)
(first (drop 1 mystream))
;=> 7
流函数使序列像io流一样有效 我认为这几乎是不可能的。 这是我的尝试。
(defprotocol Stream (first! [this]))
(defn stream [lst]
(let [alst (atom lst)]
(reify Stream
(first! [this]
(let [[fs] @alst]
(swap! alst rest)
fs)))))
(let [mystream (stream (iterate inc 1))]
(map #(if (string? %) (first! mystream) %)
[:a "e" "b" :c "i" :f]))
;=> (:a 1 2 :c 3 :f)
不幸的是,这种方法需要实现我将使用的所有功能。
答案 0 :(得分:5)
根据您对Maurits的后续评论判断,您不需要变异,而只需要在正确的位置发出一个新元素。
例如:
(defn replace-when [pred coll replacements] (lazy-seq (when (seq coll) (if (seq replacements) (if (pred (first coll)) (cons (first replacements) (replace-when pred (rest coll) (rest replacements))) (cons (first coll) (replace-when pred (rest coll) replacements))) coll))))
user=> (def seq1 [:a :b :c]) #'user/seq1 user=> (def seq2 [:x "i" "u" :y :z "e"]) #'user/seq2 user=> (replace-when string? seq2 seq1) (:x :a :b :y :z :c)
答案 1 :(得分:2)
这不适用于标准的取放,但你可以很容易地编写自己的工作来处理可变原子,例如:你可以这样做:
(def mystream (atom (range 100)))
(defn my-take [n stream]
(let [data @stream
result (take n data)]
(reset! stream (drop n data))
result))
(my-take 3 mystream)
=> (0 1 2)
(my-take 3 mystream)
=> (3 4 5)