在Ruby中,"str" * 3
会给你“strstrstr”。在Clojure中,我能想到的最接近的是(map (fn [n] "str") (range 3))
是否有更惯用的方法呢?
答案 0 :(得分:57)
这个怎么样?
(apply str (repeat 3 "str"))
或者只是
(repeat 3 "str")
如果你想要一个序列而不是一个字符串。
答案 1 :(得分:38)
使用协议的另一个有趣的替代方案:
(defprotocol Multiply (* [this n]))
接下来扩展了String类:
(extend String Multiply {:* (fn [this n] (apply str (repeat n this)))})
所以你现在可以'方便'使用:
(* "foo" 3)
答案 2 :(得分:10)
您还可以使用clojure.contrib.string中的repeat函数。如果使用诸如
之类的require将其添加到命名空间(ns myns.core (:require [clojure.contrib.string :as str]))
然后
(str/repeat 3 "hello")
会给你
"hellohellohello"
答案 3 :(得分:9)
只是为了提出更多令人敬畏和有希望发人深思的解决方案。
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"
答案 4 :(得分:3)
或者使用clojure-contrib'string package附带的repeat函数。在这种情况下,您可以使用(clojure.contrib.string / repeat 3“str”),这会产生“strstrstr”。
答案 5 :(得分:0)
我不会声称这是惯用的,但也可以使用clojure cl-format函数重复一个字符串,该函数是从常见的lisp继承的clojure。常见的lisp反过来从FORTRAN移植它,它在50年代提出了这项工作。
我们在2018年......
示例:
user=> (cl-format nil "~v@{~a~:*~}" 5 "Bob")
"BobBobBobBobBob"
格式字符串的工作原理如下:
~5@{
,其中五个是从参数列表中提取的,因为v
前面有一个@
。 ~5@{
反过来意味着使用整个参数列表(字符串“Bob”)作为可迭代次数迭代5次。 ~}
结束),我们用~a
打印字符串“Bob”,然后使用{{1将“参数指针”移回一个位置构造使我们可以再次“消耗”参数“Bob”。 应该注意~:*
可以返回生成的字符串(如果第二个参数是nil),将其打印到当前cl-format
(如果第二个参数是*out*
) ,或将其打印到作者(如果第二个参数是作家)。
有关格式字符串语法的详细信息,请参阅:
Formatted Output to Character Streams
在常见的lisp语言参考中,可能是:
为什么可以说true
是个坏主意。
答案 6 :(得分:-5)
unidiomatic解决方案:(即:不要这样做)
((fn [[x& xs]](apply(eval x)xs))(重复4'tr))