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

欢迎!请参阅关于页面,以了解更多关于此的信息。

0 投票
编译器

可复现的代码: https://gist.github.com/patrickgombert/1bcb8a051aeb3e82d855

当在 deftype 中使用 volatile-mutable 字段时,如果在同时使用 try..finally 并从方法调用中返回自身的方法中设置该字段(set!),则编译失败。省略 try..finally 或从方法中返回自身都会导致编译成功。

预期行为:set! 应该设置 volatile-mutable 变量,并且编译应该成功。

2 答案

0 投票

评论由:hiredman

这必须与 CLJ-1422 和 CLJ-701 是同一个问题,它与返回 this 没有关系,而是与 try 是否位于尾部位置有关。如果 try 不在尾部位置,编译器会将其提升到 thunk 中。实际上,代码是

(deftype SomeType [^:volatile-mutable foo] SomeProtocol (someFn [_] ((fn [] (try (set! foo 1))))))

编译器也会拒绝它,因为它不允许您从不是直接协议函数的函数中更改字段

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