В последнее время я обнаружил, что использую следующую идиому в коде clojure.
(def *some-global-var* (ref {}))
(defn get-global-var []
@*global-var*)
(defn update-global-var [val]
(dosync (ref-set *global-var* val)))
В большинстве случаев это даже не многопоточный код, которому может потребоваться транзакционная семантика, которая дает вам. Он просто чувствует, что refs - это больше, чем сквозной код, но в основном для любого глобального, который требует непреложности. Есть ли более эффективная практика для этого? Я мог бы попытаться реорганизовать код, чтобы просто использовать привязку или позволить, но это может стать особенно сложным для некоторых приложений.