Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure代理交互失败_Clojure_Agent - Fatal编程技术网

Clojure代理交互失败

Clojure代理交互失败,clojure,agent,Clojure,Agent,想象:平面世界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

想象:平面世界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)

谢谢大家!

我可以问一下你在这里想做什么吗

在我的实验中,第一个和第二个代理都失败了,这是因为你基本上是把代理放在代理里面,代理里面

例如:

(def a (agent 0))
(send-off a inc) ; -> #<Agent@29de03: 1>

您在代理中递归返回代理。

您发送了一个调用
nil
函数的请求。他确实这样做了,通过抛出一个异常,他进入了一个崩溃的状态。然后,你让他再打一次
nil
。但他甚至不能同意这样做,因为他已经筋疲力尽,正在等待有人来修理他。因此,
s_-guy
正在等待
f_-guy
确认(不一定执行)请求,而
f_-guy
已经打卡下班了。

我将尝试解释一下。就像Rich Hickey的蚁群一样,我有一个2d世界,里面有移动的物体。我想演示碰撞,一旦对象被表示为代理-要杀死对象,我必须停止代理,我向他发送nil消息。蚁群演示非常古老(大约三年)。让代理自己发送动作来模拟重复动作并不是最好的解决方案。实际上,您不应该将对象表示为“代理”,而应该使用代理(或其他东西)来管理对象不断变化的状态。你需要一个更好的模型来协调不同对象之间的状态,而不是发送一个代理
nil
(这确实会让他崩溃和烧坏,对他来说非常“粗鲁”),谢谢!我试过两次(发送f_guy nil),结果显示java.lang.RuntimeException。
(defn f_do [x]
  (do
    ...
    (send-off *agent* f_do)))