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

欢迎!请查看关于页面,以获取更多关于此功能的信息。

0
Clojure

Volatiles 和 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 表达式的双重评估

user=> (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 报告)
...