Я работаю над своей первой (нетривиальной) Clojure программой Мне не очень комфортно, когда я объявляю все свои изменчивые состояния глобально Например:
(def next-blocks (atom []))
(def num-next-blocks 1)
(def is-game-over (atom false))
(def user-name (atom (str)))
(def hs-xml (atom nil))
Поскольку я часто использую C на работе, у меня возникла идея использовать общие методы инкапсуляции в стиле C. Обычно он включает в себя объект struct, который передается в качестве первого аргумента любым «функциям-членам», которые работают с ним. См. Например, udev .
Применение этого к Clojure приведет к тому, что функции будут выглядеть так (непроверено):
(defstruct gamestate)
(defn game-new []
(struct-map gamestate
:level (atom 0)
:score (atom 0)
;etc...
))
(def game-get-score [game]
@(game :score))
(defn game-set-score [game new-score]
(reset! (game :score) new-score))
(defn game-get-level [game]
@(game :level))
(defn game-inc-level [game]
(swap! (game :level) inc))
; etc...
Я думаю, что это определенно будет шагом вперед к глобальным определениям, которые я использую в настоящее время.
Так это рекомендуемый путь? Или есть более стандартный способ Clojure?
Обновление
В настоящее время я использую Clojure 1.1.0.