2024年Clojure状态调查中分享您的看法!

欢迎!请参阅关于页面以了解有关此工作的更多信息。

0
Clojure

应该完全禁止在可变域上关闭(并生成编译器异常),而不仅仅是尝试使用 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 !!!
`

4 个答案

0

评论者:wagjo

相关问题CLJ-274

0

评论者:gshayban

在给定的示例中,闭包发生在 set! 之前,因此闭包得到了值,而不是可赋值容器。这与语言的其余部分一致(按值而不是按可变容器传递)

0

评论者:wagjo

感谢解释。这张票是关于一个提案,即在可变字段上关闭操作应该抛出错误,而不是返回值。如果需要返回值,则必须显式使用绑定。迄今为止,我还没有找到在关闭可变字段并获取关闭的值的场景中,这是预期和希望的行为的有效用例。

0
参考: https://clojure.atlassian.net/browse/CLJ-1560(由wagjo报告)
...