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

欢迎!请参阅关于页面以了解有关此功能的更多详细信息。

0
Clojure

Volatiles和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
...