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 说:更新了每次运行以使用新语法 (link: _)。

现在会抛出异常列表。

0 投票

评论者:importer

richhickey 说:我们不会允许关闭可变字段。相反,我们将不得不为用作表达式的循环等生成除了 fn 之外的代码。这不会在 cinc 之前解决。

0 投票

评论者:importer

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

0 投票

评论由:bronsa发表

针对CLJ-1226的补丁使这个功能得以实现

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

如果有兴趣,我可以提供一种补丁,将生成函数(for/try)中闭包的不可变字段访问转换为闭包在“this”上的字段访问,即 val -> (.val this)

0 投票

评论由:bronsa发表

相关票据:CLJ-1075 CLJ-1023

0 投票

评论由:bronsa发表

CLJ-701可能使循环情况正常工作

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