2024 Clojure状态调查!中分享您的想法。

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

0
打印
编辑

我想打印一个数据结构,使其整个内容都带有缩进。(例如,就好像我已经在某个深度的某个地方一样)。

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

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

我在调用pprint之前试了pprint-indent,但没有起作用(或者我用错了!)

Stel评论说,在运行pprint后添加缩进是一个解决方案。这当然有效;我更具体地想询问是否有办法让pprint这样做(以便输出仍会遵守*print-right-margin*等,而不需要我自己调整边距)。当然,如果没有办法做到这一点,Stel的解决方案是一个很好的解决方案。

有什么建议我可以尝试的吗?

谢谢!

Andrew

1 答案

+1

编辑

嗨,安德鲁:

我在推特上看到了这个信息,让我开始思考。你可以使用 with-out-str 并在所有换行符的开头和结尾添加缩进。当然,肯定有更高效的方法去做,但这种方法已经可以完成任务了

注意:根据安德鲁的建议编辑,更改了 *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)
感谢斯特尔!

如果没有办法让 pprint 从特定缩进开始,这是一个很好的解决方案。

我注意到,由于这里的缩进是施加在 pprint 外部的,如果我们想让美观输出的输出保持在常规边距内,我们可能还需要调整例如 `*print-right-margin*` 等。
哇,太棒了!我没有想到边距。我将尝试考虑 *print-right-margin* 的值来更新我的答案。
汤姆创建了一个很早以前的库,它使用自定义的调度函数来使用两个空格缩进而不是一个。也许那里有一些有用的东西,但我还没有时间深入查看。 https://github.com/tomfaulhaber/pprint-indent
感谢福格斯!
...