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

欢迎!请参阅关于页面了解关于本网站更多信息。

0
Clojure

不稳定变量和vswap!在1.7版中添加,作为高效机制来实现对语言的非同步变异
鉴于其添加是出于性能考量,vswap!被实现为一个宏,而不是一个普通函数,以避免运行时对函数变量引用的解引用以及在多个参数情况下的可选应用开销。

然而这
-不是必要的
-破坏了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)
...