在2024年Clojure现状调查中分享您的想法![调查链接]

欢迎!请参阅关于页面以了解更多关于如何使用本站的信息。

0
编译器
重新分类

这是一个有些人为的例子,但有一个可能或可能不是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视为非可变并不清楚。

1 个答案

0
...