Я хочу разместить где-нибудь ленивую последовательность, чтобы предоставлять данные по мере необходимости. Я знаю, что мне нужно избегать держаться за начало последовательности. Я придумал следующее решение, я что-то пропустил?
(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)))
произошел сбой после 5 минут использования всех 4 ядер с исключением (пространство кучи Java OutOfMemoryError)