应完全禁止对可变字段的闭包(并生成编译器异常),而不仅仅是当尝试设置!它们时。因为可变字段的改变不会传播到闭包中的字段,这会导致令人意外的错误
`
(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 !!!
`