请在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,

我在推特上看到了这个,让我有点想法。你可以使用`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!
...