gpt4 book ai didi

Clojure, Agent, 无副作用

转载 作者:行者123 更新时间:2023-12-04 06:20:26 24 4
gpt4 key购买 nike

我正在使用代理来操纵结构,但我没有所有的副作用。

所有的消息都被发送了(我已经打印并计算了它们),但有时我没有所有的副作用。好像不是我的所有功能都应用于代理的状态,或者如果最后一次发送应用于先前的状态..

我尝试了 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 和类似的,但它们不是解决方案。

最佳答案

使用 awaitawait-for等待代理完成其当前工作队列:

(await agent1 agent2 agent3)

或者
(apply await list-of-agents)

add-reg 的小改进:
(defn extend-regs [reg s o]
(update-in reg [s] conj o))

这是因为
(conj nil :b)               ; => [:b] 

因此
(update-in {} [:a] conj :b) ; => {:a [:b]}

我们终于有了。
(defn add-reg! [d s o]
(send d update-in s [:regs] conj o)

关于Clojure, Agent, 无副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6649819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com