Clojure的sprintf?

11

有一个printf函数,它直接将输出打印到标准输出流(stdout)。

sprintf函数如何呢?它与printf以相同的方式格式化字符串,但不会产生任何副作用,并返回一个字符串。

3个回答

16
在Clojure中,被称为format,并且位于clojure.coreprintf等同于(comp print format)

9
你应该查看 clojure.pprint库中的cl-format,它是Common Lisp的FORMAT函数的一个端口。它可以做Java的printf不能做的事情,比如条件语句、遍历序列等。
回答你的问题,使用cl-format,第一个参数为nil将返回一个字符串;第一个参数为true将打印到STDOUT。
user> (cl-format nil "~{~R~^, ~}" [1 2 3 4])
"one, two, three, four"

请注意,如果在Clojure中不存在format,您也可以像这样捕获Clojure的printf输出:
user> (with-out-str (printf "%s" :foo))
":foo"

with-out-str在库只提供将输出打印到STDOUT的函数时非常有用,可以使用它来捕获输出。我曾经遇到过这样的Java库。


这些Java库不会写入Clojure的*out*,是吗?你需要使用一个PrintWriter劫持System/setOut,并使用该变量。 - gtrak

6
考虑使用 with-out-str 宏:
(with-out-str
    (print x))

或者只需调用java.lang.String的format方法:

(String/format "%d" 3)

(with-out-str (print x))” 不就等同于 “(str x)” 吗? :) - bfontaine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接