你如何在Clojure中展平嵌套向量?

时间:2015-11-01 23:35:15

标签: vector clojure flatten

我有一个叫做历史的原子:

(def history (atom []))

我想要它持有向量的向量。每个向量都是一个"命令"历史向量按顺序保存所有命令的历史记录:

(swap! history conj current-command)

我希望它看起来像:

[["move" 20] ["turn" 90]]

但目前形式为:

atom[[["move" 20] ["turn" 90] ["turn" 120]]]

我可以提供一些有关如何将其展平为[["move" 20] ["turn" 90]]

的提示

2 个答案:

答案 0 :(得分:3)

历史原子的初始值可能不合适

(def history (atom []))
(swap!  history conj ["move" 20])
(swap!  history conj ["move" 30])
(swap!  history conj ["turn" 50])
; [[move 20] [move 30] [turn 50]]

(first @history)
; ["move" 20]

修改

(println history)
; atom[[["move" 20] ["turn" 90] ["turn" 120]]]

; but an atom's value should be accessed using the @ mark
(println @history)
; [["move" 20] ["turn" 90] ["turn" 120]]

答案 1 :(得分:2)

你不需要压扁它。你有一个向量包含你想要的矢量作为它的第一个也是唯一的元素。先使用:

user> (first [[["move" 20] ["turn" 90] ["turn" 120]]])
[["move" 20] ["turn" 90] ["turn" 120]]

问题是为什么你首先得到嵌套的矢量。你能分享一小段代码来生成带有额外嵌套的向量吗?