2010-08-28 52 views
11

有printf。它直接打印到标准输出。Clojure sprintf?

sprintf如何与printf格式相同,但返回的字符串没有副作用?

回答

15

在Clojure中,它被称为format并位于clojure.coreprintf相当于(comp print format)

9

你应该检查出cl-format,在clojure.pprint lib。它是Common Lisp的FORMAT函数的一个端口。它可以做的事情,Java的printf不能做,像条件语句,遍历seqs等

要回答你的问题,与cl-formatnil第一个参数将返回一个字符串;第一个参数true将打印到STDOUT。

user> (cl-format nil "~{~R~^, ~}" [1 2 3 4]) 
"one, two, three, four" 

注意,如果format尚未Clojure中的存在,你还可以捕捉从Clojure的printf像这样的输出:

user> (with-out-str (printf "%s" :foo)) 
":foo" 

with-out-str是有益的,当一个库只提供了一个功能,打印到STDOUT,而您想要捕获输出。我已经运行了这样做的Java库。

+0

这些Java库不会写Clojure的\ *总分\*, 他们会吗?你需要用一个使用var的PrintWriter劫持System/setOut。 – gtrak 2013-08-02 23:31:56

5

考虑使用与出-STR宏:

(with-out-str 
    (print x)) 

或者只是叫java.lang.String中的格式的方法:

(String/format "%d" 3)