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

欢迎!更多关于如何使用这个平台的信息,请参阅 关于 页面。

0
Clojure

不可变数据与 vswap! 是在 1.7 从中添加的性能机制,以对语言进行非协调整体的修改。
鉴于它们的添加以性能为中心,vswap! 作为一个宏而不是普通函数实现,以避免函数 var 的运行时解引用以及多个参数时的可选 apply 负载。

但是这一点
-并非必要
-破坏了 volatile/atom、swap!/vswap! 和 reset!/vreset! 的 API 并行性
-使得某些用法(例如在 update-in 表达式中的 vswaps!)变得不可能
-由于 swap! 是一个函数,可能会引起混淆

事实上,这个宏可以用具有 :inline 元数据的函数替换。
这是一个严格添加性更改,将确保对于所有当前的 vswap! 有效用法,没有任何变化,它仍然会被内联器宏展开,并且由于现在是函数,它可以在 HOF 环境中使用,其中 swap! 的使用并不少见。

7 个答案

0

由 alexmiller 评论

Nicola,请不要在票据上设置修复版本。

0

由 bronsa 评论

抱歉,我把修复版本与受影响的字段搞混了。

0

由 glchapman 评论

当前宏的另一个缺点是它会使得 vol 表达式被双重评估

用户=> (macroexpand '(vswap! (return-a-vol) inc)) (. (return-a-vol) reset (inc (.deref (return-a-vol))))

0

由 alexmiller 评论

我认为 Rich 对内联的使用不太感兴趣。

关于 Greg 的评论,如果你想要再次创建一个工单,这将会被考虑。

0

由 bronsa 评论

我并不确定我是否理解不使用内联的缺点——它工作得非常好,这正是我们希望内联的用例:出于性能原因,我们希望内联的函数。

我真的看不出将函数变成宏只是为了不用内联的合理性。

0

评论者:pbwolf

将 {{:inline}} 添加到现有函数可能会被视为一种不严谨、杂乱、绝望、悲惨的妥协,以及一个滑稽的下坡路。但 vswap! 是相反的情况:宏已经存在,有些特别。将其与函数配对会使它更完整,而不是更不完整。

0
参考:https://clojure.atlassian.net/browse/CLJ-1777(由 bronsa 报告)
...