我想使用一个Clojure向量在一个原子中建模一个有状态的FIFO(从末尾推入,从开头弹出)。尝试过:
(def stack (atom []))
然后按照以下方式
push
:(swap! stack #(conj % 1))
(swap! stack #(conj % 2))
期望的
[1 2]
但是获取
(2 1)
不是什么大问题,这意味着我必须反转(atom)的值(O(n)),以便按照我推送它们的顺序获取项目(例如,将命令流发送到虚拟机的顺序)。不过,这还是有些出乎意料的。
是否有一个clojure.core先进先出队列可以打包到一个atom中?我想到了
priority-map
,但似乎有点过头了。Clojuredocs.org上swap!
的示例使用列表或映射,不太符合我的要求。通过谷歌搜索"FIFO Clojure",我找到了很多示例,但有些有点复杂,例如clojure.core.cache(类似于映射而不是向量); amalloy的ring-buffer(外部依赖项)。我正在寻找一些真正简单明了的东西。我没有在StackOverflow的自动建议中看到答案。
(pop [1])
是[]
。那不是你的问题。现在,如果你曾经调用rest
或seq
,那么它可能会变成一个列表。 - amalloy(partial drop 1)
并无意中进行了转换。现在改用内置的pop函数。 - Reb.Cabinpop
从向量的末尾弹出,因此我认为它在最直接的用法中实现了 LIFO。当原子序列为空时,我暂时使用(swap! fifo (fn [_] []))
。 - Reb.Cabinclojure.lang.PersistentQueue
。 - amalloy