Вы не можете присвоить i
новое значение в clojure или любом другом списке, для чего это важно.i
будет в текущем контексте иметь одно и только одно значение.(inc i)
возвращает новое значение, которое может или не может быть привязано к новой локальной переменной.
Именно поэтому в языках lisp оптимизация хвостовой рекурсии так важна;потому что единственный способ эмулировать цикл - это рекурсия, где при каждом вызове функции индекс получает новое значение.Оптимизация хвостовой рекурсии позволяет избежать исчерпания стека действительно длинным циклом, поскольку преобразование рекурсии в плоский старый добрый цикл
clojure дает гарантии того, что оптимизация хвостовой рекурсии произойдет с использованием функции recur
вызовите ту же функцию снова.Если оптимизация хвостовой рекурсии невозможна, recur
выдаст ошибку во время компиляции
Редактировать В этом суть идиом неизменяемости.Существует тесная связь между неизменяемостью и программированием в функциональном стиле.Причина в том, что функциональное программирование означает «код без побочных эффектов», или, если быть точным, единственное влияние функции в вычислении - это ее возвращаемое значение.Способ достижения этого - сделать параметры и переменные неизменяемыми по умолчанию в указанном выше смысле.Хотя к настоящему времени из других постеров вы понимаете, что есть способы обойти это и не полагаться на неизменность в clojure