OK. Dotykałem Clojure i ciągle napotykam na ten sam problem. Weźmy ten mały fragment kodu:Przedefiniowanie zmiennej let'd w pętli Clojure
(let [x 128]
(while (> x 1)
(do
(println x)
(def x (/ x 2)))))
Teraz spodziewam się tego, aby wydrukować sekwencję zaczynając od 128, jak tak:
128
64
32
16
8
4
2
Zamiast tego, jest to pętla nieskończona, drukowanie 128 kółko. Oczywiście mój zamierzony efekt uboczny nie działa.
Więc jak mam przedefiniować wartość x w takiej pętli? Zdaję sobie sprawę, że to może nie być Lisp (mogłabym użyć anonimowej funkcji, która prawdopodobnie powtarza się sama), ale jeśli nie wymyślę jak ustawić taką zmienną, oszaleję.
Moim drugim domysłem byłoby użyć zestawu !, ale to daje "Nieprawidłowy cel przydziału", ponieważ nie jestem w formie wiążącej.
Proszę, oświeć mnie, jak to działa.
Dzięki. Zdaję sobie sprawę, że moim sposobem nie była Lispy, ponieważ efekty uboczne są marszczone. Hackowałem coś (problem z projektem Eulera) i nie mogłem wykonać tego prostego testu, żeby udowodnić, że czegoś nie rozumiem. Dzięki za pomoc. Zapomniałem, że pętla może się powtarzać, która działa bardzo czysto (bez dodatkowej funkcji rekursji). – MBCook
Efekty uboczne to Lispy w zależności od tego, na który Lisp patrzysz. W Common Lisp uciekłbyś (pętla dla x = 128 wtedy (/ x 2) podczas gdy (> x 1) do (druk x)). Ale efekty uboczne nie są Clojurish. –
To bardzo stary Ale to jest bardzo dobra odpowiedź, jestem nowy w Clojure, to uratowało mnie od wielu godzin zmagań z tym samym problemem. Dziękuję bardzo @BrianCarper – shan