i ++ эквивалент в Clojure - PullRequest
       0

i ++ эквивалент в Clojure

12 голосов
/ 22 декабря 2010

Я новичок в Clojure.

Есть ли ярлык для увеличения переменной в Clojure?

Во многих языках это будет работать:

i++;
i += 1;

ВClojure, я могу сделать:

(def i 1)    
(def i (+ i 1))

Это правильный способ увеличения привязки в Clojure?

Есть ли какие-либо ярлыки?

Ответы [ 3 ]

17 голосов
/ 22 декабря 2010

Вы можете написать (inc i) для увеличения целого или длинного.

(def i 1)
(def i+1 (inc i))

Если вам нужно присвоить (inc i) самой i, то, пожалуйста, сообщите, почему вы хотите это сделать.В большинстве случаев будет более элегантное (или идиоматическое) решение в ближайшем будущем.

11 голосов
/ 23 декабря 2010

Вы можете использовать атом и поменять его значение,


(let [i (atom 0)]
  (println @i)
  (swap! i inc)
  (println @i))

даст вам

0
1
5 голосов
/ 22 декабря 2010

Вы не можете присвоить i новое значение в clojure или любом другом списке, для чего это важно.i будет в текущем контексте иметь одно и только одно значение.(inc i) возвращает новое значение, которое может или не может быть привязано к новой локальной переменной.

Именно поэтому в языках lisp оптимизация хвостовой рекурсии так важна;потому что единственный способ эмулировать цикл - это рекурсия, где при каждом вызове функции индекс получает новое значение.Оптимизация хвостовой рекурсии позволяет избежать исчерпания стека действительно длинным циклом, поскольку преобразование рекурсии в плоский старый добрый цикл

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...