【发布时间】:2012-01-20 07:59:56
【问题描述】:
有没有更简单的方法可以在 Clojure 中编写这段代码:
(def queue (atom {:top nil :queue PersistentQueue/EMPTY}))
(swap! queue #(hash-map :top nil :queue (conj (:queue %) "foo")))
(let [{:keys [top]} (swap! queue
#(hash-map
:top (peek (:queue %))
:queue (pop (:queue %))))]
(println top))
另一种写法是:
(def queue (atom PersistentQueue/EMPTY))
(swap! queue conj "foo")
(let [top (atom nil)]
(swap! queue
(fn [queue]
(reset! top (peek queue))
(pop queue)))
(println @top))
这似乎更糟。
无论如何,我有一个使用原子进行大量排队的代码,而使用前一种方法会使代码非常混乱,我希望会有类似的东西:
(swap! queue (fn [queue] (AtomSwapResult. atom-value return-value))
或交换中的一些类似机制!函数,因为它似乎是您经常想要做的事情(甚至不限于排队,我已经遇到了其他几个使用返回不同值的用例,例如,被交换的旧值out)并且它不会破坏原子/交换!语义。
有没有办法在 Clojure 中做到这一点?
【问题讨论】:
标签: clojure