В большинстве случаев вы не изменяете объекты, вы создаете новые версии старых объектов:
(loop [attempt-dates []]
(if (login-is-correct)
(login)
(recur (conj attempt-dates (current-date-stamp)))))
В этом случае я использую loop
. Все, что я даю recur
, будет передано следующей итерации loop
. Я создаю новый список, который содержит новый штамп, когда я пишу (conj attempt-dates (current-date-stamp))
, затем этот новый список передается на следующую итерацию loop
.
Вот как это делается в большинстве случаев. Вместо того, чтобы думать об изменении объекта, подумайте о создании преобразованной копии объекта и передаче этой копии.
Если вам действительно действительно требуется изменяемое состояние, вы можете использовать изменяемый atom
для хранениянеизменяемое состояние:
(def mut-state (atom []))
(swap! mut-state conj 1)
(println @mut-state) ; Prints [1]
[]
все еще остается неизменным, новая версия просто заменяет старую версию в изменяемом контейнере atom
.
Если вам не нужно общатьсяхотя с обратными вызовами пользовательского интерфейса или чем-то подобным, вам обычно не нужна изменчивость. Попрактикуйтесь в использовании loop
/ recur
и reduce
.