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形式,所以已记录为bug

`
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说:将每次运行更新为新语法(link: _)。

现在给出异常列表。

0

评论由:importer 发表

richhickey说:我们不会允许闭包访问可变字段。相反,我们将不得不为表达式中使用循环等特殊形式生成除了fn以外的其他东西。这不会在cinc之前出现。

0

评论由:importer 发表

http://www.assembla.com/spaces/clojure/tickets/274 转换而来

0
by

评论者:bronsa

CLJ-1226 的补丁实现了这个功能

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

如果有兴趣,我可以提供一个补丁,该补丁将生成的函数(循环/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 报告)
...