Я работаю над игрой в Clojure, используя Swing.У меня есть KeyListener, чтобы позаботиться об элементах управления, но он не обновляет ссылку.
(def move (ref :drop))
(defn get-move
[block state x y moves]
(do (println @move)
(if (check-move @move x y block state) @move
:nothing)))
(defn listener
[keyevent]
(let [c (.getKeyChar keyevent)]
(do (println c)
(cond (= c "j") (dosync (ref-set move :left))
(= c "l") (dosync (ref-set move :right))
(= c "i") (dosync (ref-set move :rotate))
(= c "k") (dosync (ref-set move :drop))))))
(defn make-keylistener
[]
(proxy [KeyAdapter] []
(keyPressed [event]
(listener event))))
Теперь идея состоит в том, что основная функция, которая обновляет графический интерфейс, вызывает get-move.Он проверяет, действителен ли в игре ход ref, и если да, то возвращает его.Слушатель присоединяется к JPanel и изменяет ссылку на основе нажатия клавиши.Слушатель работает нормально - каждый раз, когда нажимается кнопка, он печатает символ клавиши.Я могу только предположить, что это меняет ссылку.Однако get-move всегда возвращает одно и то же значение - он никогда не видит изменения @move.Мне кажется, что я неправильно понимаю нечто фундаментальное в параллелизме и состоянии в Clojure.Что я делаю не так, и есть ли более функциональный способ справиться с этим?
Спасибо!
РЕДАКТИРОВАТЬ: та же проблема возникает, если я использую атомы.