I ++ эквивалент в Clojure
Я новичок в Clojure.
Есть ли ярлык для увеличения переменной в Clojure?
На многих языках это будет работать:
i++;
i += 1;
В Clojure я могу сделать:
(def i 1)
(def i (+ i 1))
Это правильный способ увеличения привязки в Clojure?
Есть ли ярлыки?
Ответы
Ответ 1
Вы можете написать (inc i)
, чтобы увеличить целое или длинное число.
(def i 1)
(def i+1 (inc i))
Если вам нужно назначить (inc i)
на i
, то, пожалуйста, скажите, почему вы хотите это сделать. В большинстве случаев в clojure будет более элегантное (или идиоматическое) решение.
Ответ 2
Вы можете использовать атом и поменять его значение,
(let [i (atom 0)]
(println @i)
(swap! i inc)
(println @i))
предоставит вам
0
1
Ответ 3
вы не можете назначить i
новое значение в clojure или любом другом lisp, для чего это важно. i
будет в текущем контексте иметь одно и только одно значение. (inc i)
возвращает новое значение, которое может или не может быть привязано к новой локальной переменной.
Вот почему в lisp языках оптимизация хвостовой рекурсии так важна; потому что единственный способ эмулировать цикл - это рекурсия, где при каждом вызове функции индекс имеет новое значение. оптимизация хвостовой рекурсии позволяет избежать исчерпания стека с действительно длинным циклом путем преобразования рекурсии в плоский старый старый цикл
clojure дает гарантии, что оптимизация хвостовой рекурсии произойдет с помощью функции recur
для повторного вызова той же функции. Если оптимизация хвостохранилища невозможна, recur
даст ошибку времени компиляции
Изменить. В этом суть идиом inmutability. Существует сильная связь между неспособностью и функциональным программированием. Причина в том, что функциональное программирование означает "код без побочных эффектов", или, если быть точным, единственным влиянием функции в вычислении является его возвращаемое значение. Способ достижения этой цели заключается в том, что параметры и переменные по умолчанию являются значениями в указанном выше смысле. Хотя теперь с других плакатов вы понимаете, что есть способы обойти это и не полагаться на inmutability в clojure