2012-09-21 85 views
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为字符串。我该怎么做呢?

+0

我解决了问题如下 - (EVAL('的concat(STR)(对于[线(范围1 5)](STR “行=” 行)))) – juise

回答

8

您需要'申请'。

(apply println (for [line (range 1 5)] (str "line=" line))) 

另外,

(println (apply str (interpose " " (map #(str "line=" %) (range 1 5))))) 
2

相反的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倍。

+0

减少不是真正用于为了调用具有副作用的代码而迭代列表。 – Bill

3

这个怎么样。 doseq是关于对序列做副作用,印刷是一个副作用。

(doseq [line (range 1 5) 
     :let [msg (str "line=" line " ")]] 
     (print msg))