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

编辑

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)
by
谢谢Stel!

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

我注意到,由于这里的缩进是应用于外部pprint的,如果我们想让 nicely-printed 输出保持在常规边距内,我们可能还需要调整如 e.g. `*print-right-margin*` 等。
by
很好的注意!我没有想到边距的问题。我会考虑*print-right-margin*的值来更新我的答案。
by
Tom很久以前创建了一个仓库,使用了自定义的调度函数来使用2个空格的缩进而不是1个。这里可能有些有用的东西,但我还没有时间深入查看。https://github.com/tomfaulhaber/pprint-indent
by
谢谢Fogus!
...