Wenn die Länge 4 ist, wird die folgende Schleife 5 mal ausgeführt. 5 Zeichen aus dem Stream lesenClojure-Schleife liest eine zusätzliche
(loop [i (.read stream) result "" counter length]
(let [c (char i)]
(println "=>" c)
(if (zero? counter)
result
(recur (.read stream) (str result c) (dec counter)))))
Also ich sollte, aber ich noch nicht bekommen, warum es 5 Mal ausgeführt wird? Ist das das Clojure-Verhalten oder fehlt mir etwas? –
Ihre Version liest, wenn Zähler = 4, 3, 2, 1, 0. Das sind fünf Iterationen. Der erste Lesevorgang wird innerhalb des Schleifenbindungsvektors durchgeführt, um zunächst "i" einzurichten, und die nächsten vier Lesevorgänge erfolgen über "recur". Wenn Sie 'counter' für' zero? 'Testen, haben Sie bereits einen zu viel gelesen. Die Version, die ich gepostet habe, verschiebt den Lesevorgang in die if-Anweisung, wodurch dieses Problem vermieden wird. Sie brauchen keinen weiteren Test vor der Schleife. –
Gehe durch deine Schleife in deinem Kopf, du wirst sehen, woher das fünfte Zeichen kommt. Im Grunde genommen ist das Wiederholen der gleichen Sache (.read-stream) an zwei Stellen in der Schleife ein Code-Geruch. – Svante