【发布时间】:2011-07-22 23:10:32
【问题描述】:
在 Ruby 中,"str" * 3 会给你“strstrstr”。在 Clojure 中,我能想到的最接近的是(map (fn [n] "str") (range 3)) 有没有更惯用的做法?
【问题讨论】:
标签: clojure
在 Ruby 中,"str" * 3 会给你“strstrstr”。在 Clojure 中,我能想到的最接近的是(map (fn [n] "str") (range 3)) 有没有更惯用的做法?
【问题讨论】:
标签: clojure
这个怎么样?
(apply str (repeat 3 "str"))
或者只是
(repeat 3 "str")
如果你想要一个序列而不是一个字符串。
【讨论】:
apply 是否会达到参数计数的限制?
还有一个更有趣的使用协议的替代方案:
(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"
【讨论】:
(clojure.string/join (repeatedly 3 (partial str "str")))。与第一个相似但不同。
您还可以使用 clojure.contrib.string 中的重复函数。如果您使用 require 将其添加到您的命名空间,例如
(ns myns.core (:require [clojure.contrib.string :as str]))
然后
(str/repeat 3 "hello")
会给你
"hellohellohello"
【讨论】:
或者使用clojure-contrib'string package自带的repeat函数。在这种情况下,您可以使用 (clojure.contrib.string/repeat 3 "str") 生成 "strstrstr"。
【讨论】:
我不会声称这是惯用的,但也可以使用 clojure cl-format 函数重复字符串,该函数是 clojure 从 common lisp 继承的。 Common lisp 又从 50 年代提出这项工作的 FORTRAN 移植过来。
我们在 2018 年...
例子:
user=> (cl-format nil "~v@{~a~:*~}" 5 "Bob")
"BobBobBobBobBob"
格式字符串的作用如下:
~5@{,其中五个是从参数列表中拉出的,因为@ 前面有一个v。 ~5@{ 反过来意味着使用整个参数列表(字符串“Bob”)作为可迭代对象迭代 5 次。 ~} 结尾),我们用~a 打印字符串“Bob”,然后使用~:* 构造“将参数指针”移回一个位置,这样我们可以再次“消费”论点“Bob”。 瞧,鲍勃重复了 5 次。
需要注意的是cl-format可以要么返回产生的字符串(如果第二个参数为nil),打印到当前的*out*(如果第二个参数是true),或者打印到一个writer(如果第二个参数是 writer)。
有关格式字符串语法的所有细节,您可以参考:
Formatted Output to Character Streams
在通用 lisp 中的语言参考和可能:
为什么有人认为cl-format 是个坏主意。
【讨论】:
单一的解决方案:(即:永远不要这样做)
((fn [[x & xs]] (apply (eval x) xs)) (repeat 4 'str))
【讨论】: