如何以惯用的clojure方式将字符串重复n次?

如何以惯用的clojure方式将字符串重复n次?,clojure,Clojure,在Ruby中,“str”*3将为您提供“strstrstrstr”。在Clojure中,我能想到的最接近的是(map(fn[n]“str”)(range 3))有没有更惯用的方法 (apply str (repeat 3 "str")) 或者只是 (repeat 3 "str") 如果您想要序列而不是字符串。或使用clojure contrib'附带的repeat函数。在这种情况下,您可以使用(clojure.contrib.string/repeat 3“str”)生成“strstrstr

在Ruby中,
“str”*3
将为您提供“strstrstrstr”。在Clojure中,我能想到的最接近的是
(map(fn[n]“str”)(range 3))
有没有更惯用的方法

(apply str (repeat 3 "str"))
或者只是

(repeat 3 "str")

如果您想要序列而不是字符串。

或使用clojure contrib'附带的repeat函数。在这种情况下,您可以使用(clojure.contrib.string/repeat 3“str”)生成“strstrstrstr”。

您也可以使用clojure.contrib.string中的repeat函数。如果使用require将其添加到命名空间中,例如

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

我会给你

"hellohellohello"

还有一个使用协议的有趣替代方案:

(defprotocol Multiply (* [this n]))
接下来,将扩展String类:

(extend String Multiply {:* (fn [this n] (apply str (repeat n this)))})
因此,您现在可以“方便地”使用:

(* "foo" 3)

我只是想提出一些更棒、更能发人深省的解决方案

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"

单向解决方案:(即:永远不要这样做)

((fn[[x&xs]](apply(eval x)xs))(重复4'str))


我不认为这是惯用的,但也可以使用clojure从CommonLisp继承的clojure函数重复字符串。Common lisp又将其从50年代提出这项工作的FORTRAN中移植过来

2018年,我们来到这里

例如:

user=> (cl-format nil "~v@{~a~:*~}" 5 "Bob")
"BobBobBobBobBob"
格式字符串的工作方式如下:

  • 第一个格式说明符是
    ~5@{
    ,其中五个从参数列表中提取,因为
    @
    前面有一个
    v
    ~5@{
    反过来意味着使用整个参数列表(字符串“Bob”)作为iterable进行5次迭代
  • 在卷曲中(卷曲表达式以
    ~}
    结尾),我们使用
    ~a
    打印字符串“Bob”,然后使用
    ~:*
    构造将参数指针“向后移动”一个位置,以便我们可以再次“使用”参数“Bob”
瞧,鲍勃重复了5次

应该注意的是,
cl-format
可以返回生成的字符串(如果第二个参数为nil),将其打印到当前的
*out*
(如果第二个参数为
true
),或者将其打印到编写器(如果第二个参数为编写器)

有关格式字符串语法的详细信息,请参考:

在通用lisp中,语言引用和可能引用:


关于为什么会有人认为
cl格式
是个坏主意。

完美!我知道必须有重复这样的东西,只是找不到它如果你有很多重复的话,
apply
在参数计数上达到了极限?+1对于比clojure.contrib.string/repeat:)有趣,但不要在家里这样做。:)这似乎真的很有用,但它似乎已经不存在了。你知道用Clojure 1.4做这件事的方法吗?@EricWilson在语言版本1.3开始时到了其他地方。Clojure.contrib.string被迁移到了不再包含“重复”的位置。d投票。无意冒犯,但问题是关于a“更好的方法”,而不是“模糊的clojure竞赛”之类的东西……我建议你要么改进答案并说明为什么你的解决方案“更好”,要么删除它以防止更多的热量……@Rick77:答案中说:“非传统的解决方案”。我猜否决投票是公平的。我还想补充一句:
(clojure.string/join)(重复3次)(部分str“str”)
。与第一个类似但不同。
user=> (cl-format nil "~v@{~a~:*~}" 5 "Bob")
"BobBobBobBobBob"