请在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表达式重复评估

用户=> (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)
...