(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)
Ich nahm an, dass ich gerade bemerkenswert dicht war. Aber nein, es stellt sich heraus, dass Clojure tatsächlich die ersten 32 Elemente einer beliebigen Lazy-Sequenz auswertet (falls verfügbar). Autsch.Ist "für" nicht wirklich faul in clojure?
Ich hatte eine for
mit einem rekursiven Aufruf in der :let
. Ich war sehr neugierig, warum die Berechnung eher in der Breite als in der Tiefe vor sich ging. Es scheint, dass die Berechnung explodiert (obwohl, um fair zu sein, nicht die Erinnerung), während ich weiter über alle oberen Zweige des rekursiven Baums ging. Clojures 32-Chunking erzwang eine breite erste Bewertung, obwohl die logische Absicht des Codes die erste war.
Wie auch immer, gibt es einen einfachen Weg, um 1-Chunking statt 32-Chunking von Lazy-Sequenzen zu erzwingen?
Vielen Dank! Das hat mich für zwei Stunden ratlos gemacht. Ich konnte nicht herausfinden, warum (nimm 1 (map some-func [1 2 3 4]))) wertet einige Funktionen für alle 4 Elemente aus ... Ich muss sagen, es war nicht offensichtlich, warum das geschah, vom Lesen der Dokumente auf "map" und "take" –