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

评论者:导入器

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

现在将提供列出的异常。

0

评论者:导入器

richhickey说:我们不允许关闭可变域。相反,我们将为用作表达式的循环等生成除了fn之外的其他内容。在cinc之前不会实现。

0
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 报告)
...