Разве for в clojure не является ленивым?

(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?

15
задан Matt Fenwick 16 May 2012 в 00:10
поделиться