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

欢迎!请参阅关于页面以获取更多关于这是如何工作的信息。

0
Clojure

不可变性和 vswap! 在 1.7 中被添加作为对语言进行无协调变异的高效机制。
由于它们的加入是以性能为中心的,vswap! 被实现为一个宏而不是一个普通函数,以避免在运行时多次参数的函数 var 引用和可能的开销。

然而这
-是不必要的
-破坏了 volatile/atom swap!/vswap! reset!/vreset! 之间的 api 并行性
-使得某些用法(update-in 格式中的 vswaps!)变得不可能
-由于 swap! 是一个函数,因此可能令人困惑

实际上,该宏可以用具有 :inline 元数据的函数替换。
这是一个严格增加的变化,将确保对于所有当前有效的 vswap! 使用,没有任何变化,它仍然会由分线器宏展开,并且由于现在它是一个函数,它可以在 HOF 环境中使用,在 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 报告)
...