Я - новичок 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]
В зависимости от того, обращаетесь ли вы к нему через много индексов или повторяете его, более подходящим может быть вектор или последовательность.
Всегда есть цикл
, если вам нужен бесконечный (ленивый) поток повторяющихся элементов:
user> (take 9 (cycle suits))
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades :clubs)
(непроверено!)
(apply concat (repeat 2 suits))
, надеюсь, поможет.
concat
, конечно, объединит 2 списка; apply
может использоваться, чтобы переместить заданную функцию в начало существующего списка для оценки.
Небольшие эксперименты с 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)