【问题标题】:Clojure - is this an appropriate use of an atom?Clojure - 这是对原子的适当使用吗?
【发布时间】:2013-07-24 10:28:03
【问题描述】:

G'day 大师,

我编写了一些利用访问者模式的 Java 库的代码。我想要将访问者的所有杂乱细节隐藏在一个 Clojure 函数后面,该函数接受输入参数并返回一个简单的数据结构,其中包含访问者派生的所有状态。

诀窍是在 Java 端有多个“visitXXX”回调,并且没有简单的方法可以从它们返回状态(Java,作为 Java,假设由各种访问者建立的任何状态都存储在实例变量)。

我所做的(看起来效果很好,fwiw)是在 let 块中定义一个原子,并让我的每个访问者函数交换!当它们被 Java 访问代码调用时,具有更新值的原子。然后,在 Java 访问者完成后,我将取消引用的原子返回到主“驱动程序”函数的末尾。

我的问题是:这是对原子的适当用法吗?如果没有,有没有更惯用的方法来做到这一点?

如果有人感兴趣,有问题的代码是here

免责声明:我仍然是 Clojure n00b,因此代码对于更有眼光的人来说可能是可怕的。欢迎评论/反馈/批评!

提前致谢!

【问题讨论】:

  • 抱歉,您能否提供更多关于您的问题的详细信息?如果您可以发布一些代码 sn-ps 并解释他们在做什么,那就太好了。例如。 “这个函数可以做到这一点,在这里我有一个 let close 中的原子。“原子在这里和这里这样使用......”。因为不容易理解你的问题的上下文。
  • 抱歉,我在原始帖子中包含的链接不明显 - 这里是明确的:github.com/pmonks/depends/blob/master/src/depends/…

标签: clojure


【解决方案1】:

您使用原子的方法很好,看起来不错而且很流行。

如果您也在寻找其他方法;因为您可以将您的问题拆分为一些将产生和回答(您的访问者)的代码和一些其他需要答案的代码,所以 Clojure 的 promisedeliver 函数可能非常适合。

如果您在 let 块中创建承诺,则让访问者 deliver 获得承诺的结果。

【讨论】:

  • 感谢 Arthur - 非常感谢您抽出宝贵时间回答!
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多