(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-chunking заставлял первую оценку, хотя логический смысл кода был глубиной вначале.
Во всяком случае, есть ли какой-либо простой способ заставить 1-chunking, а не 32-chunking ленивых последовательностей?