【问题标题】:How can I pretty print a quoted list in clojure?如何在 clojure 中漂亮地打印引用列表?
【发布时间】:2013-08-04 14:19:43
【问题描述】:

给定一个类似的列表:

(quote (do (println "Hello") (println "Goodbye")))

:我怎样才能把它变成一个格式很好的字符串,它会输出如下内容:

(do
  (println "Hello") 
  (println "Goodbye")
)

【问题讨论】:

    标签: clojure


    【解决方案1】:

    将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 ...)

    【讨论】:

    • 太棒了,我会试试这个,让你知道
    • 我在 lighttable 中试过这个,但在控制台上什么也没有。如何让 prn/print-edn 只返回一个字符串?
    • 我做了 (prn/print-edn (p/parse-string (str (quote (do (println "Hello") (println "Goodbye"))) ))) 但它返回 nil 并且控制台中什么也没有显示
    • 很抱歉给您带来了困惑。我混了。向上。我修改了我的答案,希望您满意。
    • 酷,你将不再需要 clj-rewrite,顺便说一句。 :)
    【解决方案2】:

    作为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 还不支持代码调度。

    【讨论】:

    • 它不支持 Clojure 代码。例如。 let-bindings 将单行打印,或者在打印之前生成使用 hash-tags 定义的 lambdas。
    • 这同样适用于 clojure.pprint。 (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)。
    • 哦,你是对的,对不起——谢谢你让我正确。阅读时应注意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多