2024年Clojure调查!中分享您的想法。

欢迎!请参阅关于页面了解有关如何使用此工具的更多信息。

0
记录和类型

最简单的情况

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

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

java.lang.IllegalArgumentException: 无法分配给不可变:val (文件:5)
`

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

已记录为错误,因为loop特殊形式有时会扩展为fn形式

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

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

java.lang.IllegalArgumentException: 无法分配给不可变:val (无源文件:9)
`

7 答案

0

评论者:importer

donmullen说:已经更新了每次运行到(_)的新语法。

现在给出异常。

0

评论者:importer

richhickey说:我们不会允许闭包可变字段。相反,我们将生成除fn之外的东西作为用作表达式的循环等的形式。不会在cinc之前完成。

0
0
by

由 bronsa 发表的评论:

CLJ-1226 的补丁使该功能得以实现

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

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