请在2024clojure调查问卷中分享您的想法!

欢迎!有关如何使用本服务的更多信息,请参阅关于页面。

0投票
记录和类型

最简单的情况

`
用户=>
(deftype Bench [#^{:unsynchronized-mutable true} val]
可运行
(run [_]

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

java.lang.IllegalArgumentException: 无法分配到非可变的:val (NO_SOURCE_FILE:5)
`

函数应当能够在它们的周围deftype中更改可变字段(就像Java中的内部类一样)。

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

`
用户=>
(deftype Bench [#^{:unsynchronized-mutable true} val]
可运行
(run [_]

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

java.lang.IllegalArgumentException: 无法分配到非可变的:val (NO_SOURCE_FILE: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](https://clojure.atlassian.net/browse/CLJ-274) (由 alex+import 报告)
...