У меня длинная, ленивая последовательность, которую я хочу уменьшить и проверить лениво. Как только два последовательных элемента не являются =
(или каким-либо другим предикатом) друг к другу, я хочу прекратить использовать список, который стоит дорого. Да, это звучит как take-while
, но читайте дальше.
Я хотел написать что-то простое и элегантное, как это (притворяясь, что every?
работает как reduce
):
(every? = (range 100000000))
Но это не работает лениво, и поэтому он висит на бесконечных секундах. Я обнаружил, что это работает почти так, как я хотел:
(apply = (range 100000000))
Однако я заметил, что чередование последовательности приводит к созданию лишних, ненужных элементов, которые создаются и тестируются. По крайней мере, это то, что я думаю, это то, что происходит в следующем фрагменте кода:
;; Displays chunking behavior in groups of four on my system and prints 1 2 3 4
(apply = (map #(do (println %) %) (iterate inc 1)))
;; This prints 0 to 31
(apply = (map #(do (println %) %) (range)))
Я нашел обходное решение, используя take-while
и count
, чтобы проверить количество принятых элементов, но это довольно громоздко.
Должен ли я вежливо предложить Rich Hickey, чтобы он правильно сочетал короткое замыкание reduce
и every?
, или я пропустил какой-то очевидный способ, который уже существует?
РЕДАКТИРОВАТЬ:. Два добродушных человека опубликовали решения для избежания чередования по ленивым последовательностям, но как мне избежать chunking при выполнении apply
, который, кажется, потребляет в chunked группах из четырех?
РЕДАКТИРОВАТЬ № 2: Как отмечает Стюарт Сьерра, я обнаружил, что это не на самом деле. Он просто действует нормально, поэтому я назову это закрытым и дам ему ответ. Я включил небольшую функцию в отдельный ответ, чтобы сделать уменьшающуюся часть проблемы, для тех, кто заинтересован.