(take 2 (for [x (range 10)
:let [_ (println x)]
:when (even? x)] x))
>> (* 0
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
0 2)
Я предположил, что просто был на редкость туп. Но нет, оказывается, что Clojure на самом деле оценивает первые 32 элемента любой ленивой последовательности (если она доступна). Ой.
У меня был for
с рекурсивным вызовом в :let
. Мне было очень любопытно, почему вычисления, похоже, идут в ширину, а не в глубину. Кажется, вычисления (хотя, если честно, не память) взрывались, пока я спускался по всем верхним ветвям рекурсивного дерева. Разбиение Clojure на 32 фрагмента вынуждало выполнять вычисления в ширину, хотя логический смысл кода был в первую очередь в глубину.
В любом случае, есть ли какой-нибудь простой способ заставить ленивые последовательности разбиваться на 1, а не на 32?