2011-05-12 5 views
1

평면 세계 n * n 세포를 상상해보십시오. 움직이는 물체가 있습니다. 그들은 충돌 할 수 있고, 과정 중 하나는 파괴되어야합니다.Clojure 에이전트 상호 작용 실패

저는 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) 

고맙습니다!

답변

2

f_guy에게 nil으로 전화를 요청했습니다. 그는 그렇게했고, 예외를 던짐으로써 부서진 상태에 빠지게했다. 그런 다음 nil에 다시 전화하라고 요청합니다. 그러나 그는 그렇게하기로 동의하지도 않습니다. 왜냐하면 그는 부러지고 그를 고치기 위해 누군가 기다리고 있기 때문입니다. 그래서 s_guyf_guy이 요청을 확인 (반드시 수행 할 필요는 없음)하고, f_guy이 오늘을 체크 아웃 할 때까지 기다리고 있습니다.

+0

감사! 나는 (f_guy nil을 두 번 보내려고) 두 번 시도했는데 ** java.lang.RuntimeException **이 표시되었다. –

1

여기서 무엇을하려고합니까?

모두 제 1 및 제 2 에이전트는 기본적으로 에이전트 내부 에이전트 내부에 에이전트를두고 있기 때문에 내 실험 실패 ...

예 : 그래서

(def a (agent 0)) 
(send-off a inc) ; -> #<[email protected]: 1> 

하여이 일을 :

(defn f_do [x] 
    (do 
    ... 
    (send-off *agent* f_do))) 

상담원 내부에서 상담원을 재귀 적으로 반환합니다.

+0

나는 설명하려고 노력할 것이다. Rich Hickey의 개미 식민지에서와 마찬가지로 저는 2D 세계와 움직이는 물체를 가지고 있습니다. 충돌을 피하고 오브젝트가 에이전트로 표현 되 자마자 * 오브젝트를 죽이기 위해서 나는 에이전트를 멈추고, 그에게 nil 메시지를 보냄으로써합니다. –

+3

개미 식민지 데모는 매우 오래되었습니다 (3 년). 에이전트가 반복 액션을 시뮬레이션하는 액션을 보내는 것이 가장 좋은 방법은 아닙니다. 실제로 "객체로"객체를 나타내지 말고 객체의 변화하는 상태를 관리하기 위해 에이전트 (또는 다른 것)를 사용하십시오. 에이전트 nil을 보내지 않고 (실제로 그를 쓰러 뜨리고 태우며 매우 무례합니다), 다양한 객체간에 상태를 조정하는 방법에 대한 더 나은 모델이 필요합니다. – amalloy