エージェントを使用して構造を操作していますが、すべての副作用があるわけではありません。
すべてのメッセージが送信されます (印刷して数えました) が、すべての副作用がない場合があります。私の機能のすべてがエージェントの状態に適用されていないかのように、または最後の送信が前の状態に適用されているかのように..
doall、dorun を試してみましたが、解決策が見つかりませんでした。
;; aux function for adding an element to a hashmap
(defn extend-regs [reg s o]
(let [os (get reg s)]
(if (nil? os)
(assoc reg s [o])
(assoc reg s (conj os o)))))
;; the agent's altering function - adding an element to the :regs field(a hashmap)
(defn add-reg! [d s o]
(send d (fn [a] (assoc a :regs (extend-regs (:regs a) s o)))))
;; Creating the agents, dct/init returns an agent
;; pds: data for fields
(defn pdcts->init-dcts! [pds]
(doall (map dct/init (map :nam pds) (repeat nil))))
;; Altering one agent's state, dct/add-reg sends an assoc message to the agent
;; d: agent, pd: data for fields
(defn dct->add-regs! [d pd]
(dorun (map (fn [s r] (dct/add-reg! d s r))
(:syms pd)
(:regs pd)))
d)
;; Going through all agents
;; ds: agents, pds: datas
(defn dcts->add-regs! [ds pds]
(dorun (map (fn [d pd] (dct->add-regs! d pd))
ds
pds))
ds)
編集: ============================================== =====
さて、スレッドがタスクを完了するのを十分に待っていないことがわかりました。問題は、エージェントを監視する方法です。キューに未完了のスレッドがあることをどのように知ることができますか? swank.core/ active-threadsおよび同様のものしか見つかりませんでしたが、それらは解決策ではありません。