我想要一个原子中的Clojure矢量来模拟一个有状态的FIFO(推到底,从头开始弹出)。试图Clojure原子将矢量转换为列表?
(def stack (atom []))
然后push
如下:
(swap! stack #(conj % 1))
(swap! stack #(conj % 2))
期待
[1 2]
但得到
(2 1)
没什么大不了的,它只是意味着我必须扭转( O(n))的值原子(持久性列表)以按顺序获取项目的顺序(例如,按顺序将命令性命令流送到虚拟机)。尽管如此,这是一个惊喜。
是否有clojure.core FIFO我可以打包成一个原子?我想到了priority-map
,但它似乎矫枉过正。关于clojuredocs.org上的swap!
的示例使用列表或地图,但不是我想要的。我发现了很多搜索“FIFO Clojure”的样本,但有些样本有点丰富,例如clojure.core.cache(类似地图而不是向量样); amalloy的环形缓冲区(外部依赖)。寻找真正小而直接的东西。我没有在StackOverflow的自动建议中看到答案。
你说得对。调查。 –
上下文是一堆重复测试推送和弹出。看起来像当我将最后一个项目从矢量堆栈中弹出时,原子剩下一个空列表而不是空矢量。后续将连接推到列表上而不是矢量。修复很容易在我的弹出功能中 - 如果最后一个弹出窗口清空堆栈,则放回空载体中。 –
不,'(pop [1])'是'[]'。这不是你的问题。现在,如果你曾经调用过'rest',或者'seq',这可能会使它成为一个列表。 – amalloy