请分享您的想法并在2024年Clojure状态调查中投票!

欢迎!请查看关于页面了解更多关于该功能的信息。

0
记录和类型

最简单的情况

`
user=>
(deftype Bench [#^{:unsynchronized-mutable true} val]
Runnable
(run [_]

(fn [] (set! val 5))))

java.lang.IllegalArgumentException: Cannot assign to non-mutable: val (NO_SOURCE_FILE:5)
`

函数应该能够在其周围的deftype中修改可变字段(就像Java中的内部类一样)。

将此作为错误报告,因为循环特殊形式有时会展开为fn形式

`
user=>
(deftype Bench [#^{:unsynchronized-mutable true} val]
Runnable
(run [_]

(let [x (loop [] (set! val 5))])))

java.lang.IllegalArgumentException: Cannot assign to non-mutable: val (NO_SOURCE_FILE:9)
`

7 答案

0

评论由:importer

donmullen说:更新每次运行到(链接:_)为新的语法。

现在会抛出异常列表。

0

评论由:importer

richhickey说:我们不允许封装可变字段。相反,我们将必须为循环等表达式生成某种除了fn之外的东西。不会在cinc之前推出。

0
0
by

评论由:bronsa

CLJ-1226补丁使这可行

(deftype Bench [#^{:unsynchronized-mutable true} val] Runnable (run [_] (let [x (loop [] (set! (.val _) 5))])))

如果有需求,我可以提供一个补丁,该补丁将生成的函数(for/try)中封闭的可变字段访问转换为封闭的“this”上的字段访问,即 val -> (.val this)

0
by

评论由:bronsa

相关工单:CLJ-1075 CLJ-1023

0
by

评论由:bronsa

CLJ-701可能使循环情况可行

0
by
参考:https://clojure.atlassian.net/browse/CLJ-274 (由 alex+import 报告)
...