如何以惯用的clojure方式重复n次?

时间:2011-03-25 14:20:48

标签: clojure

在Ruby中,"str" * 3会给你“strstrstr”。在Clojure中,我能想到的最接近的是(map (fn [n] "str") (range 3))是否有更惯用的方法呢?

7 个答案:

答案 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次。
  • 在curlies中(卷曲表达式由~}结束),我们用~a打印字符串“Bob”,然后使用{{1将“参数指针”移回一个位置构造使我们可以再次“消耗”参数“Bob”。
Voila,Bob重复了5次。

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

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

Formatted Output to Character Streams

在常见的lisp语言参考中,可能是:

Eliminating format from lisp

为什么可以说true是个坏主意。

答案 6 :(得分:-5)

unidiomatic解决方案:(即:不要这样做)

  

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