Почему можно переопределить Var (учитывая, что значения FP неизменяемы)?

Я использую Counterclockwise для запуска REPL, но я заметил это и на Leiningen.

Я могу вызвать def для определения var дважды. Например,

=> (def a 1)
#'fractal.core/a
=> a
1
=> (def a 2)
#'fractal.core/a
=> a
2

Clojure - это язык функционального программирования, а в объектах FP предполагается неизменным. Если я могу сделать это в каком смысле, это непреложно?

Спасибо за любые комментарии.

Ответ 1

Вся точка зрения заключается в том, что они могут быть отскок, следовательно, имя: var → variable.

Из docs:

Clojure - это практический язык, который признает случайную необходимость поддерживать постоянную ссылку на меняющуюся стоимость.... Vars предоставляет механизм для ссылки на изменяемое место хранения, которое может динамически восстанавливаться (в новое хранилище) по каждому потоку.

Вы не изменяете неизменяемое значение, перебирая var.

Подумайте об этом, просто указав неизменяемое значение имени, а затем дайте другое неизменяемое значение этому имени.

Ответ 2

re - def Ввод var (то есть установка корневого связывания, в отличие от временного/потокового локального переобучения) в основном предназначен для разработки. Поскольку стандартные глобальные функции и значения (определенные с def/defn) основаны на var, вы можете переопределить их без перезапуска программы clojure, которую вы редактируете.

Обратите внимание, что vars не являются значениями, они явно предназначены для изменяемых ссылок на значения/функции.

Ответ 3

в объектах FP должны быть неизменными.

Это неверно.

Для чистого функционального программирования переменные должны быть неизменяемыми. Тем не менее, Clojure не является чисто функциональным языком и позволяет избежать необратимых побочных эффектов в любом месте.

Большинство функциональных языков в этом отношении нечисто, поскольку они не отслеживают происхождение побочных эффектов, таких как мутация, в самом языке.