在Clojure中重复向量

Ral*_*lph 6 sequences clojure playing-cards

我是一个Clojure新手.我想获得两份卡套装的副本.我能想到的非DRY方式是

(def suits [:clubs :diamonds :hearts :spades])
(def two-times (concat suits suits))
Run Code Online (Sandbox Code Playgroud)

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

我试过的所有事情,比如

(replicate 2 suits)
Run Code Online (Sandbox Code Playgroud)

导致两个单独的向量:

([:clubs :diamonds :hearts :spades] [:clubs :diamonds :hearts :spades])
Run Code Online (Sandbox Code Playgroud)

如何"压扁"结构?

Bri*_*per 8

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]
Run Code Online (Sandbox Code Playgroud)

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

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

user> (take 9 (cycle suits))
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades :clubs)
Run Code Online (Sandbox Code Playgroud)