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

欢迎!有关如何使用本网站的更多信息,请参阅关于 页面。

0 投票
Clojure

volatile 和 vswap! 平台在 1.7 版本中添加,作为高效机制以获得语言的不协调突变。
由于这种添加主要关注性能,vswap! 被实现为一个宏而不是普通函数,以避免在运行时解引用函数 var,并避免在具有多个参数的情况下的可选 apply 负担。

但是这
-是多余的
-打破了 volatile / atom swap! / vswap! reset! / vreset! 之间的 API 平行性
-使得某些使用场景(在 update-in 表达式中的 vswaps!)成为不可能
-由于 swap! 是一个函数,因此可能引起混淆

事实上,这个宏可以用具有 :inline 元数据的函数替换。
这是一个严格增量更改,将确保对于 vswap! 的所有当前有效使用,没有任何变化,它仍将由内联器宏展开,并且由于现在它是一个函数,它可以在通常看到 swap! 使用的 HOF 环境中使用。

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