想象一下:平坦的世界n * n细胞。有移动的物体。它们可以相互碰撞,并且根据过程中的一个应该被摧毁。
我使用来自Rich Hickey的蚁群的想法将对象表示为代理。因此,在碰撞之后,代理人必须在收到其他代理人的消息后停止工作。
有一个代码片段来说明我的问题:第二个代理意外停止。
;agents
(def f_guy (agent nil))
(def s_guy (agent nil))
;functions for agents
(defn f_do [x]
(do
(Thread/sleep 20)
(println "f")
(send-off *agent* f_do)))
(defn s_do [x]
(do
(Thread/sleep 40)
(println "s")
(send-off f_guy nil)
(send-off *agent* s_do)))
;the process
(defn start []
(do
(send-off f_guy f_do)
(send-off s_guy s_do)))
;go
(start)
谢谢!
答案 0 :(得分:2)
您向f_guy
发送了一个请求,要求nil
作为一项功能。他做了,并且通过抛出一个例外让他陷入了破碎状态。然后,你让他再次打电话给nil
。但他甚至不能同意这样做,因为他已经破碎并等待有人来修理他。因此,s_guy
正在等待f_guy
确认(不一定执行)请求,并且f_guy
已经暂停了当天。
答案 1 :(得分:1)
我可以问你在这里想要完成什么?
我的实验中第一个和第二个代理都失败了,因为你基本上是将代理放在代理内部的代理中......
示例:
(def a (agent 0))
(send-off a inc) ; -> #<Agent@29de03: 1>
通过这样做:
(defn f_do [x]
(do
...
(send-off *agent* f_do)))
您在代理内递归返回代理。