如何找出Clojure代理进入无效状态的原因

时间:2014-09-15 16:52:02

标签: clojure agent

Clojure允许使用set-validator!根据某些规则检查代理的新状态是否有效。由于某种原因,代理的值设置为nil,我的验证器会捕获这种情况。但是,我无法弄清楚这是怎么发生的 - 是否有某种方法来确定试图设置无效状态的动作?

1 个答案:

答案 0 :(得分:0)

代理也可以与watches一起使用,因此将记录器添加到记录所有状态转换的代理是非常合理的,这样当出现问题时,您可以使用此日志重播导致的转换失败(并希望从那里到问题)

user> (def x (agent 0))
#'user/x
user> (def states (atom []))
#'user/states
user> (add-watch x :state-logger (fn [& change] (swap! states conj change)))
#<Agent@1dff7647: 0>
user> (send x inc)
#<Agent@1dff7647: 0>
user> (send x dec)
#<Agent@1dff7647: 0>
user> (send x inc)
#<Agent@1dff7647: 1>
user> @states
[(:state-logger #<Agent@1dff7647: 1> 0 1) 
 (:state-logger #<Agent@1dff7647: 1> 1 0) 
 (:state-logger #<Agent@1dff7647: 1> 0 1)]

(take 200 ...)放入观察者可能是明智的,因此您只能保持合理数量的状态(或使用环形缓冲区)