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*的值。
汤姆很久以前创建了一个仓库,该仓库使用一个自定义的派遣函数,使用2个空格缩进而不是一个。其中可能有一些有用的内容,但我还没有时间深入研究。https://github.com/tomfaulhaber/pprint-indent
谢谢Fogus!
...