在ref中弹出PersistentQueue的惯用方法是什么?

Ale*_*ler 12 queue concurrency clojure

给出ref中的PersistentQueue:

(def pq (ref clojure.lang.PersistentQueue/EMPTY))
Run Code Online (Sandbox Code Playgroud)

弹出队列并获得结果的惯用方法是什么?

我对你的批评的最好尝试:

(defn qpop [queue-ref]
    (dosync 
        (let [item (peek @queue-ref)]
          (alter queue-ref pop)
          item))
Run Code Online (Sandbox Code Playgroud)

alter返回已经弹出的队列的事务内值,因此您不能单独执行alter.

cgr*_*and 5

我想不出一些更为惯用的东西,而不是将你的dosync的主体抽象掉.

但是,如果您正在进行特技表演,则可以尝试逐个黑客攻击:始终将PQ的头部视为垃圾(它包含先前弹出的项目).接下来你可以重写qpop:

(defn qpop [queue-ref]
  (peek (alter queue-ref pop))
Run Code Online (Sandbox Code Playgroud)

它会增加对空虚的特殊检查(特别是当你结合时).它还意味着保持对项目的引用的时间超过它应该的时间(但是如果你看一下PQ的impl,你会看到它通过itsef它可能会长时间引用弹出的项目,所以活力已经是模糊的).

在这里用过这个黑客.