在Clojure中使用def ref维护状态

时间:2014-10-02 16:35:05

标签: function clojure state ref

我有以下功能:

(defn best-move [tracked-moves]
  (def all-scores (ref tracked-moves))
    @all-scores)

它被递归函数调用。 我希望能够继续通过跟踪移动,并让它们全部存在于其中 @所有得分。 现在它的编写方式,@ all-scores只会保留最后的跟踪动作。如何在每次调用最佳移动函数时保持它接收的所有数据?而且不只是返回它收到的所有数据的最后一个?

1 个答案:

答案 0 :(得分:2)

问题是您错误地使用了def。使用def(和defn)将创建命名空间级别的var。你拨打def的地方并不重要。正如您所指出的那样,您不断重新定义all-scores。简短的回答是将all-scores的定义提升到最高级别,因此您不会经常调用它。然后,按照documentation中的说明更新ref。如果您不使用交易,并且不需要管理多个参考,则可能需要使用atoms