请在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投票

评论者:bronsa

CLJ-1226 补丁使得这种情况得到工作

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

如有需要,我可以提供一个补丁,将生成的函数(循环/尝试)对关闭的不可变字段的访问转换为关闭的 "this" 字段访问,即 val -> (.val this)

0投票

评论者:bronsa

相关工单:CLJ-1075 CLJ-1023

0投票

评论者:bronsa

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

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