我是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])

如何“展平”结构?

最佳答案

concat给您一个懒惰的序列。如果要结束一个(非惰性)向量,请执行以下操作:

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]

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

如果您想要无尽的(重复的)重复元素流,那么总是也有cycle:
user> (take 9 (cycle suits))
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades :clubs)

10-01 21:10