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

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

0 投票
Clojure

可变性(volatile)和vswap!是在1.7版中加入的,作为实现语言无协调性突变的高效机制。
由于她们的加入是以性能为中心的,vswap!被实现为一个宏而并非常规函数,以避免函数var的运行时解引用以及在多个参数情况下的可选应用开销。

然而这
-是不必要的
-打破了volatile/atom swap!/vswap! reset!/vreset!之间的api并行性
-使得某些使用场景变得不可能(update-in形式中的vswaps!)
-会有潜在混淆,因为swap!是一个函数

实际上,该宏可以用具有:inline元数据的函数替换。
这是一个严格增加的改变,将使得对于所有当前有效的vswap!用法,都不会发生变化,它仍然会被内联器宏展开,而且由于现在是一个函数,它可以在HOF上下文中使用,而其中swap!的使用并不罕见。

7 个答案

0 投票

评论者:alexmiller

尼古拉,请不要在票务上设置修复版本。

0 投票

评论者:bronsa

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

0 投票

评论者:glchapman

当前宏的另一个缺点是会导致vol表达式的重复评估

用户=> (宏展开 '(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](https://clojure.atlassian.net/browse/CLJ-1777) (由bronsa报告)
...