Clojure原子将向量转换为列表?

时间:2017-08-05 17:18:53

标签: clojure

我想在一个原子中使用Clojure矢量来建模一个有状态的FIFO(推到最后,从头开始弹出)。试图

(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!的示例使用列表或地图,而不是我想要的。我通过Google搜索和#34; FIFO Clojure找到了大量的样本,"但有些有点丰富,例如,clojure.core.cache(类似地图而不是矢量); amalloy的环缓冲区(外部依赖)。寻找真正小而简单的东西。我没有在StackOverflow的自动建议中看到答案。

1 个答案:

答案 0 :(得分:5)

在更广泛的代码环境中,某些东西并不完全正确;我假设你比你发布的例子中有更多的内容?

这是我的REPL中的结果以及我所期待的:

user=> (def stack (atom []))
#'user/stack
user=> (swap! stack #(conj % 1))
[1]
user=> (swap! stack #(conj % 2))
[1 2]
user=> @stack
[1 2]

使用向量时,项目会添加到集合的末尾。如果stack是一个列表,那么您看到的结果就像是您所获得的行为,例如:加到前面:

user=> (def stack (atom '()))
#'user/stack
user=> (swap! stack #(conj % 1))
(1)
user=> (swap! stack #(conj % 2))
(2 1)
user=> @stack
(2 1)

所以我想知道你代码中的某个地方是否以某种方式最终定义了一个列表,而不是一个向量。