我想在一个原子中使用Clojure向量来建模一个有状态的FIFO(推到最后,从头开始弹出).试着
(def stack (atom []))
Run Code Online (Sandbox Code Playgroud)
那么push如下:
(swap! stack #(conj % 1))
(swap! stack #(conj % 2))
Run Code Online (Sandbox Code Playgroud)
期待
[1 2]
Run Code Online (Sandbox Code Playgroud)
但得到
(2 1)
Run Code Online (Sandbox Code Playgroud)
没什么大不了的,它只是意味着我必须反转(O(n))原子(持久列表)的值以获得顺序中的项目而不是我推送它们(例如,命令行的命令流到虚拟机)为了).不过,这是一个惊喜.
是否有一个clojure.core FIFO我可以装入一个原子?我想到了priority-map,但似乎有点矫枉过正.对于这些例子swap!在clojuredocs.org使用列表或地图,没有完全是我想要的.我通过谷歌搜索"FIFO Clojure"找到了大量的样本,但有些有点丰富,例如,clojure.core.cache(类似地图而不是矢量); amalloy的环缓冲区(外部依赖).寻找真正小而简单的东西.我没有在StackOverflow的自动建议中看到答案.
在更广泛的代码环境中,某些东西并不完全正确; 我假设你比你发布的例子中有更多的东西?
这是我的REPL中的结果以及我期望的结果:
user=> (def stack (atom []))
#'user/stack
user=> (swap! stack #(conj % 1))
[1]
user=> (swap! stack #(conj % 2))
[1 2]
user=> @stack
[1 2]
Run Code Online (Sandbox Code Playgroud)
使用向量时,项目将添加到集合的末尾.你看到的结果看起来就像你得到的行为,如果stack是一个列表,例如添加到前面:
user=> (def stack (atom '()))
#'user/stack
user=> (swap! stack #(conj % 1))
(1)
user=> (swap! stack #(conj % 2))
(2 1)
user=> @stack
(2 1)
Run Code Online (Sandbox Code Playgroud)
所以我想知道你代码中的某个地方,你最终定义了一个列表,而不是一个向量.