我所做的:如何打印列表作为字符串没有括号
user=> (println (for [line (range 1 5)] (str "line=" line)))
,并得到:
(line=1 line=2 line=3 line=4)
,但我想只有line=1 line=2 line=3 line=4
为字符串。我该怎么做呢?
我所做的:如何打印列表作为字符串没有括号
user=> (println (for [line (range 1 5)] (str "line=" line)))
,并得到:
(line=1 line=2 line=3 line=4)
,但我想只有line=1 line=2 line=3 line=4
为字符串。我该怎么做呢?
您需要'申请'。
(apply println (for [line (range 1 5)] (str "line=" line)))
另外,
(println (apply str (interpose " " (map #(str "line=" %) (range 1 5)))))
相反的apply
,你可以选择使用reduce
像这样:
user> (reduce #(str %1 " line=" %2) "" (range 1 5))
=> " line=1 line=2 line=3 line=4"
的reduce
函数是一个函数,函数(姑且称之为如果f),一个“起始值”,然后是将被用作第二个参数的事物列表nt到f。它懒惰地打电话f上的起始值和列表中的第一个项目,然后调用f这是什么返回和列表中的第二项,然后调用f什么这返回和第三项列表等等,直到它耗尽了列表中的所有项目(或者说 - 因为它很懒,如果你“问它”,它只会遍历整个列表)。
如果你不喜欢出发的空间,你可以将整个东西包装在triml
(你必须先做(use 'clojure.string)
)。或者你可以做(reduce #(str %1 "line=" %2 " ") (range 1 5))
,这将把空间放在最后。
我的经验是,只要你可以用apply
做点什么,你可以用reduce
稍微优雅些。更重要的是,我的reduce
替代方案有总是通常比我的apply
之一快。 我当然不能保证这总会是真的,我还没有为你的特定问题做过速度测试。
编辑
我做了一些粗略计时,用我的版本(reduce
)与JohnJ的第二个建议(apply
),并发现他们长达(range 1 100)
非常相似,但通过(range 1 500)
的apply
版本速度至少快4倍。
减少不是真正用于为了调用具有副作用的代码而迭代列表。 – Bill
这个怎么样。 doseq
是关于对序列做副作用,印刷是一个副作用。
(doseq [line (range 1 5)
:let [msg (str "line=" line " ")]]
(print msg))
我解决了问题如下 - (EVAL('的concat(STR)(对于[线(范围1 5)](STR “行=” 行)))) – juise