这是一个有些人为的例子,但有一个可能或可能不是bug的奇怪行为。
假设您有一个以下协议
(defprotocol P (f [this]))
具有可变参数和锁的具体类型
(deftype T [^:volatile-mutable x lock]
P
(f [this]
(locking lock
(set! x true)
(prn ""))))
编译器对此没有问题。但将(prn "")
语句移到(locking …)
块外面,您会得到:
(deftype T [^:volatile-mutable x lock]
P
(f [this]
(locking lock
(set! x true))
(prn "")))
Syntax error (IllegalArgumentException) compiling fn* at (REPL:4:5).
Cannot assign to non-mutable: x
David Miller在最新的ClojureCLR中发现了这种行为(见https://clojure.atlassian.net/browse/CLJCLR-122),正在调查原因,但同样的错误在JVM Clojure中也会引发,这表明Clojure本身可能存在bug,或者这里有一些非常反直觉的规则在起作用,其细节值得理解。编译器在这里为什么将x视为非可变并不清楚。