我有一个原子,它有两个部分.
(def thing (atom {:queue '() :map {}}))
Run Code Online (Sandbox Code Playgroud)
我想更新:queue和:map在一个原子笔划中,以防止它们脱离同步.
(swap! thing update-in [:queue] (list 1))
Run Code Online (Sandbox Code Playgroud)
(从这个问题:如何附加到Clojure原子中的嵌套列表?)
(swap! thing assoc-in [:map 1] (:key :value))
Run Code Online (Sandbox Code Playgroud)
(从这个问题:在Clojure原子中使用swap到MERGE(追加)嵌套映射?)
如何在单个交换语句中执行这些操作?(假设这会阻止他们脱离同步?)
ama*_*loy 10
你想做一个改变,对吧?你可以把这个改变写成纯粹的功能吗?您需要做的就是编写该函数,并将其作为参数传递给swap!.
(defn take-from-queue [{q :queue, m :map}]
{:queue (rest q), :map m (assoc m :new-task (first q))})
(swap! thing take-from-queue)
Run Code Online (Sandbox Code Playgroud)
当然,我不知道你真正想要你的函数的主体做什么,所以我做了一些不会抛出异常的东西.