OK. Я возился с Clojure, и я постоянно сталкиваюсь с той же проблемой. Возьмем этот маленький фрагмент кода:
(let [x 128]
(while (> x 1)
(do
(println x)
(def x (/ x 2)))))
Теперь я ожидаю, что это напечатает последовательность, начинающуюся с 128 следующим образом:
128
64
32
16
8
4
2
Вместо этого это бесконечный цикл, который печатает 128 снова и снова. Очевидно, что мой предполагаемый побочный эффект не работает.
Итак, как мне переопределить значение x в цикле? Я понимаю, что это может быть не как Lisp вроде (я мог бы использовать анонимную функцию, которая, возможно, повторяет его сам), но если я не буду выяснять, как установить такую переменную, я сойду с ума.
Мое другое предположение было бы использовать set!, но это дает "Недопустимый целевой объект назначения", так как я не в форме привязки.
Пожалуйста, просветите меня, как это должно работать.