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

欢迎!请在关于页面查看更多此如何工作的信息。

0
打印
编辑

我想pprint一个数据结构,整个结构都打印出缩进。(例如,好像我已经有多级缩进一样)。

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

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

我在调用pprint之前尝试过调用pprint-indent,但它不起作用(或是我用错了!)

Stel评论说,在运行pprint后添加缩进是解决方案。这当然有效;我更具体地想知道是否有让pprint这样做的方法(这样输出就会继续符合*print-right-margin*等,而无需我自己调整边距)。当然,如果没有这样的方法,Stel的解决方案是一个良好的替代方案。

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

谢谢!

Andrew

1 个答案

+1

编辑

Hi there Andrew,

我在推特上看到了这个,它激发了我的思考。你可以使用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的外部,如果我们想使美观输出的输出保持在其通常的边缘内,我们可能还需要调整如`*print-right-margin*`等。
很好!我没想到边缘。我将尝试用*print-right-margin*的值更新我的回答。
Tom创建了一个很久以前就使用的存储库,它使用了自定义的调度函数,以两个空格缩进来代替的空格。这里可能有一些有用的内容,但我没有时间深入研究。https://github.com/tomfaulhaber/pprint-indent
谢谢Fogus!
...