我想在某处放置一个惰性序列以根据需要提供数据。我知道我必须避免抓住序列的头部。我想出了以下解决方案,我错过了什么吗?
(defn headless [s]
(let [a (atom s)]
(fn
([] (let [s @a r (first s)]
(swap! a rest) r))
([n] (let [s @a rs (take n s)]
(swap! a #(drop n %)) rs)))))
使用示例,这个简单的生成器只给出自然数。
(def nums (headless (iterate inc 0)))
(nums 5)
; (0 1 2 3 4)
(nums)
;5
更新:“测试”应该使用 dorun,而不是 doall。参见 lgrapenthin 的解决方案
一个(不太现实的)测试
(doall (map #(nums %) (repeat 20)))
使用所有 4 个内核 5 分钟后崩溃并出现异常(OutOfMemoryError Java 堆空间)