OK. Ich habe mit Clojure herumgebastelt und stoße ständig auf das gleiche Problem. Lassen Sie uns dieses kleine Codefragment nehmen:Neudefinieren einer Let'd-Variablen in Clojure-Schleife
(let [x 128]
(while (> x 1)
(do
(println x)
(def x (/ x 2)))))
Jetzt habe ich dies erwarten wie so mit 128 Starten einer Sequenz auszudrucken:
128
64
32
16
8
4
2
Stattdessen ist es eine Endlosschleife, Druck 128 über und über. Offensichtlich funktioniert meine beabsichtigte Nebenwirkung nicht.
Also, wie soll ich den Wert von x in einer Schleife wie dieser neu definieren? Mir ist klar, dass das nicht Lisp sein mag (ich könnte eine anonyme Funktion verwenden, die vielleicht auf sich selbst zurückgeht), aber wenn ich nicht herausfinde, wie ich Variablen so einstellen kann, werde ich verrückt werden.
Meine andere Vermutung wäre, gesetzt zu verwenden !, aber das gibt „Ungültige Zuordnung Ziel“, da ich nicht in einer verbindlichen Form bin.
Bitte erleuchten Sie mich, wie dies funktionieren soll.
Dank. Ich merke, dass mein Weg nicht Lispy war, da Nebenwirkungen verpönt sind. Ich habe etwas durchgecheckt (ein Projekt-Euler-Problem) und konnte diesen einfachen Testfall nicht zum Laufen bringen, was beweist, dass ich etwas nicht verstanden habe. Danke für die Hilfe. Ich habe vergessen, dass die Schleife sich wiederholen könnte, das funktioniert sehr sauber (ohne die zusätzliche Funktion Rekursion). – MBCook
Nebenwirkungen sind Lispy abhängig davon, welche Lisp Sie betrachten. In Common Lisp kommst du mit (Schleife für x = 128, dann (/ x 2), während (> x 1) (x drucken)). Aber Nebenwirkungen sind nicht Clojurish. –
Es ist sehr alt Aber das ist eine sehr gute Antwort, ich bin neu in Clojure das rettete mich von Stunden des Kämpfens mit dem gleichen Problem. Vielen Dank @BrianCarper – shan