2011-02-03 60 views
12

由於在裁判一PersistentQueue:什麼是在ref中彈出PersistentQueue的慣用方法?

(def pq (ref clojure.lang.PersistentQueue/EMPTY)) 

什麼是彈出隊列,並得到結果的慣用方法是什麼?

我對你的批評最好的嘗試:

(defn qpop [queue-ref] 
    (dosync 
     (let [item (peek @queue-ref)] 
      (alter queue-ref pop) 
      item)) 

ALTER回報這已經是彈出隊列中,交易價值,所以你不能只是做了改變由本身。

+0

添加到隊列的習慣是:(dosync(改變pq連接新項目)) – 2011-02-03 19:55:50

回答

5

我想不出更多的習慣,把你的dosync的身體抽象掉。

但是,如果您正在進行特技活動,您可以嘗試off-by-one hack:始終將PQ的頭部視爲垃圾(它包含之前彈出的項目)。由此可見,你可以重寫qpop

(defn qpop [queue-ref] 
    (peek (alter queue-ref pop)) 

它即被添加特殊檢查空虛(特別是當你連詞)。這也意味着要保持對該項目的引用時間超過它應該的時間(但是,如果你看看PQ的impl,你會發現它可能會導致對彈出項目的引用時間過長,所以活躍性已經很模糊)。

我用這個hack here

+0

你是一個可怕的傢伙cgrand。 [我的意思是恭維。 :)] – 2011-02-04 22:22:17

1

您的dosync正文可以使用Common Lisp的prog1宏來簡化,儘管核心Clojure似乎缺少它。有一個簡單的實現on the Google group,以及一些關於如何在Clojure中將它變成函數(而不是宏)的討論。

+0

謝謝,好的提示。 – 2011-02-04 22:21:41

相關問題