2024 Clojure 发展状况调查 中分享您的想法!

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

0
记录和类型

最简单的情况

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

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

java.lang.IllegalArgumentException: 无法赋值给非可变值:val (没有文件来源:5)
`

函数应该能够修改其作用域内的可变字段(就像 Java 中的内部类一样)。

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

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

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

java.lang.IllegalArgumentException: 无法赋值给非可变值:val (没有文件来源:9)
`

7 个答案

0

评论者:importer

donmullen 说:更新了每次运行以使用 (_ 链接) 的新语法。

现在给出列表中的异常。

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(由ale ImportError提出)
...