请分享您在2024年Clojure调查!中的想法。

欢迎!请参阅关于页面了解有关此内容的更多信息。

0
打印
编辑

我想pprint一个数据结构,使其整体带缩进打印出来。(就像我已经在某些层深度的例子中一样)

(pprint x)
{:foo ...
 :bar ...}

(pprint-with-indentation x)
    {:foo ...
     :bar ...}

我在调用pprint-indent之后尝试了pprint,但不起作用(或者我使用错误!)

Stel评论说,在运行pprint后添加缩进是一个解决方案。这当然可以工作;我更具体的是询问是否可以让pprint这样做(这样输出就会继续符合*print-right-margin*等,而无需我自己调整边距)。当然,如果这不可能,Stel的解决方案是一个良好的折衷方案。

有什么建议可以尝试吗?

谢谢!

Andrew

1 个答案

+1

编辑

嗨,Andrew:

我在Twitter上看到这个,让我有了灵感。您可以使用with-out-str并在每个换行符后添加缩进。确实有更有效的方法,但这种方法可以完成工作。

注意:经Andrew建议修改*print-right-margin*值。

(require '[clojure.pprint :as pprint])

(defn gen-pprint-with-indentation [indent-num]
  (fn pprint-with-indentation [x]
    (let [indent-str (->> \space repeat (take indent-num) (apply str))
          new-margin (- pprint/*print-right-margin* indent-num)]
      (binding [pprint/*print-right-margin* new-margin]
        (->> x
             pprint/pprint
             with-out-str
             (map #(if (= \newline %) (str \newline indent-str) %))
             (apply str indent-str)
             println)))))

(def data {:hi :there
           :wow {:much :pprint
                 :ok [:cooljflksdjfdslkfjkldsjskdlfjsdlkfjksldjfslkj]
                 :seriously {:hi "hiiiiiiiiiiiiii"}}})

(def pprint-5 (gen-pprint-with-indentation 5))

(pprint-5 data)
感谢Stel!

如果没有办法让pprint从特定缩进开始,这是一个好办法。

我注意到在这里,缩进是应用在pprint外部的,如果我们想让输出格式化后的内容保持.reserve sensible margins,我们可能还需要调整例如`*print-right-margin*`等参数。
很好的一发现!我没有想到边缘问题。我会考虑*print-right-margin*值来更新我的回答。
Tom 很久以前创建了一个仓库,其中使用自定义分发函数来实现两空格缩进而不是一个空格。里面可能有有用的东西,但我还没有机会深入了解。 https://github.com/tomfaulhaber/pprint-indent
by
谢谢Fogus!
...