如何以惯用的clojure方式将字符串重复n次?
在Ruby中,如何以惯用的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
“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
反过来意味着使用整个参数列表(字符串“Bob”)作为iterable进行5次迭代~5@{
- 在卷曲中(卷曲表达式以
结尾),我们使用~}
打印字符串“Bob”,然后使用~a
构造将参数指针“向后移动”一个位置,以便我们可以再次“使用”参数“Bob”~:*
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"