2

G'day 大师们,

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

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

我所做的(并且似乎工作得很好,fwiw)是在 let 块中定义一个原子,并让我的每个访问者函数交换!当它们被 Java 访问代码调用时,具有更新值的原子。然后,在 Java 访问者完成后,我将 deref'ed atom 从主“驱动程序”函数的末尾返回。

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

如果有人感兴趣,有问题的代码在这里

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

提前致谢!

4

1 回答 1

2

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

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

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

于 2013-07-24T22:06:57.860 回答