在Clojure中重复向量

时间:2010-04-23 18:34:35

标签: clojure sequences playing-cards

我是Clojure新手。我想获得两份卡套装的副本。我能提出的非DRY方式是

(def suits [:clubs :diamonds :hearts :spades])
(def two-times (concat suits suits))

必须有更多功能的方式(即使它需要更多的字符:-))。如果我想要N次怎么办?有什么建议吗?

我尝试过的所有事情,比如

(replicate 2 suits)

导致两个单独的向量:

([:clubs :diamonds :hearts :spades] [:clubs :diamonds :hearts :spades])

如何“压扁”结构?

4 个答案:

答案 0 :(得分:7)

concat给你一个懒惰的seq。如果你想最终得到(非懒惰)矢量:

user> (into suits suits)
[:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades]
user> (reduce into (replicate 2 suits))
[:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades]

根据您是通过索引大量访问它还是迭代它,可能更适合使用vector或seq。

如果你想要一个重复元素的无尽(懒惰)流,那么总是cycle

user> (take 9 (cycle suits))
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades :clubs)

答案 1 :(得分:2)

(未经测试!)

(apply concat (repeat 2 suits))

希望能够做到这一点。

concat当然会连接2个列表; apply可用于将给定函数走私到现有列表的头部位置以进行评估。

答案 2 :(得分:2)

使用REPL进行的一些实验使我得到了这个解决方案:

user=> (def suits [:clubs :diamonds :hearts :spades])
#'user/suits
user=> suits
[:clubs :diamonds :hearts :spades]    
user=> (reduce concat (replicate 2 suits))
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades)

答案 3 :(得分:1)

(take (* 2 (count suits)) (cycle suits))