Подтвердить что ты не робот

Как повторить строку n раз в идиоматическом стиле clojure?

В Ruby "str" * 3 вы получите "strstrstr". В Clojure наиболее близким, о котором я могу думать, является (map (fn [n] "str") (range 3)) Есть ли более идиоматический способ сделать это?

4b9b3361

Ответ 1

Как насчет этого?

(apply str (repeat 3 "str"))

Или просто

(repeat 3 "str")

если вам нужна последовательность вместо строки.

Ответ 2

И еще одна забавная альтернатива, использующая протоколы:

(defprotocol Multiply (* [this n]))

Далее класс String расширен:

(extend String Multiply {:* (fn [this n] (apply str (repeat n this)))})

Итак, теперь вы можете "удобно" использовать:

(* "foo" 3)

Ответ 3

Вы также можете использовать функцию повторения от clojure.contrib.string. Если вы добавите это в свое пространство имен, используя, например,

(ns myns.core (:require [clojure.contrib.string :as str]))

затем

(str/repeat 3 "hello")

предоставит вам

"hellohellohello"

Ответ 4

Просто бросьте несколько более устрашающих и, надеюсь, продуманных решений.

user=> (clojure.string/join (repeat 3 "str"))
"strstrstr"

user=> (format "%1$s%1$s%1$s" "str")
"strstrstr"

user=> (reduce str (take 3 (cycle ["str"])))
"strstrstr"

user=> (reduce str (repeat 3 "str"))
"strstrstr"

user=> (reduce #(.concat %1 %2) (repeat 3 "str"))
"strstrstr"

Ответ 5

Или используйте функцию повтора, которая поставляется с clojure -contrib 'строковым пакетом. В этом случае вы можете использовать (clojure.contrib.string/repeat 3 "str" ), что приводит к "strstrstr".

Ответ 6

унидиоматическое решение: (т.е. НЕ КОГДА-ЛИБО ЭТО)

((fn [[x и xs]] (применить (eval x) xs)) (repeat 4 'str))