应完全禁止在可变字段上闭包(并生成编译器异常),而不仅仅是尝试设置!它们。因为可变字段的改变不会传递到闭包中,这会导致意想不到的错误
`
(defprotocol P
(-set [this])
(-get [this])
(-get-fn [this]))
(deftype T [^:unsynchronized-mutable val]
P
(-set [this] (set! val :bar))
(-get [this] val)
(-get-fn [this] (fn [] val)))
(def x (->T :foo))
(def xf (-get-fn x))
user> (-set x)
:bar
user> (-get x)
:bar
user> (xf)
:foo ;; 应该是 :bar !!!
`