2016-04-20 5 views
1

Довольно новый для clojure, так что будьте добрыми.Почему моя карта не обновляется?

(def state {:currentPosition "1"}) 

(while (not= (state :currentPosition) "2") ; this is true 
    (assoc state :currentPosition "2") ; 
)  

Это вызывает бесконечный цикл, и он не запускается, но я не понимаю, почему. Условие

(not= (state :currentPosition) "2") 

верно

поэтому цикл начинается, то внутри цикла, я обновляет состояние. Почему конец петли и не закрывает светлый стол? Спасибо

+1

Бен, ответ Петра правильный, учитывая то, что вы специально задали. Вы можете это знать, но то, что вы делаете, не идиоматично. (Иногда вам все равно нужно делать такие вещи, поэтому атомы существуют.) Хорошо, что вы делаете так, как вы привыкли делать это, когда вы впервые изучаете язык, но вы захотите изучить Clojure- стиль стратегии кодирования довольно быстро. Сначала это может быть неловко, но как только вы привыкнете к функциональному программированию, это красиво и весело (imho). Если я расскажу вам то, что вы уже слышали, просто игнорируйте этот комментарий. – Mars

+0

Я полностью согласен, я пытаюсь запрограммировать «нормально». Это просто реальное большое изменение в том, что я привык к lol – Ben

ответ

6

Clojure datastructures являются неизменяемыми, поэтому (assoc state :currentPosition "2") не мутирует объект, присвоенный state var, а просто возвращает новую версию карты.

Если вы хотите изменить значения в ваших варах, вам необходимо обернуть их в один из Clojure's refs. Например, вы можете использовать atom:

(def state (atom {:currentPosition 1})) 

(reset! state {:currentPosition 2})  
@state ;; => {:currentPosition 2} 

(swap! state update :currentPosition inc) 
@state ;; => {:currentPosition 3} 
+0

круто, спасибо, попробуем сейчас – Ben

+0

эй я не могу проверить, работает ли это, потому что когда я пытаюсь сделать: (not = (state: currentPosition) "2 »), он говорит, что Atom не может быть передан IFn Любые идеи? еще раз спасибо – Ben

+0

Если вы хотите прочитать значение от атома, вам нужно 'deref' it:' (deref currentPosition) '. Существует также сокращенная версия: '@ currentPosition' –

Смежные вопросы