应完全禁止关闭对可变字段的操作(并生成编译器异常),而不仅仅是尝试使用 set! 操作。由于可变字段的更改不会传播到被关闭的字段中,这可能导致意外的错误。
`
(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 !!!
`