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