【发布时间】:2013-08-04 14:19:43
【问题描述】:
给定一个类似的列表:
(quote (do (println "Hello") (println "Goodbye")))
:我怎样才能把它变成一个格式很好的字符串,它会输出如下内容:
(do
(println "Hello")
(println "Goodbye")
)
【问题讨论】:
标签: clojure
给定一个类似的列表:
(quote (do (println "Hello") (println "Goodbye")))
:我怎样才能把它变成一个格式很好的字符串,它会输出如下内容:
(do
(println "Hello")
(println "Goodbye")
)
【问题讨论】:
标签: clojure
将clojure.pprint/write 与clojure.pprint/code-dispatch 一起使用:
(clojure.pprint/write '(do (println "Hello") (println "Goodbye"))
:dispatch clojure.pprint/code-dispatch)
对于那少量的代码,您不会得到换行符。但是这样的电话
(clojure.pprint/write '(do (println "Hello") (println "Goodbye") (println "Hey, you left me out!"))
:dispatch clojure.pprint/code-dispatch)
返回
=> (do
(println "Hello")
(println "Goodbye")
(println "Hey, you left me out!"))
要将其作为字符串捕获,请将调用包装在 (with-out-str ...)
【讨论】:
作为clojure.pprint 的性能显着提高的替代方案,您可能想试试 Brandon Bloom 的 fipp:
;; add [fipp "0.4.0"] to :dependencies
(require '[fipp.edn :as fipp])
(fipp/pprint '(do (println :foo) (println :bar) (println :quux))
{:width 30}) ; force wrapping despite small size of data
;; printed output:
(do
(println :foo)
(println :bar)
(println :quux))
很遗憾,Fipp 还不支持代码调度。
【讨论】:
(let [x 1 y 2] :foo) 由 clojure.pprint 和 fipp 打印在一行上; (let [a 1 b 2 c 3 ... z 26] :foo) 由两者打印,每个原子在单独的行上。 #() 风格的函数实际上被 Clojure 阅读器转换为 fn* 形式,所以 fipp 和 clojure.pprint 看到的是 fn* 形式(假设正确引用),当然两者都可以很好地处理这些(例如漂亮的打印(pprint '#(:foo)) 打印出(fn* [] (:foo)),无论您使用的是fipp 还是clojure.pprint 的pprint)。