漂亮打印和展开

4

编辑 我不仅仅是要求每一行代码都缩进,而是关于“漂亮打印”和/或更广泛定义的“缩进”,其中行将根据其包含内容进行分组/拆分。

这是一个函数(我编写它来解决欧拉问题,但这不是重点:我可以用不同的方式编写它),我正在尝试漂亮地打印:

手动缩进版本:

(apply max
       (flatten
        (for [x (range 100 1000)]
          (map
           #(if (= (str (* x %)) (apply str (reverse (str (* x %)))))
              (* x %)
              0)
           (range x 1000)))))

显然这不是唯一正确的Lisp缩进/打印风格。因为我想从一开始就养成好习惯,所以我尝试了"pretty print",并从Emacs的slime-repl clojure REPL中执行了以下操作:

user> (doc pprint)      ;; just to show which version of pprint I'm using
clojure.pprint/pprint
...

所以我尝试去做:

user> (pprint '(apply max
       (flatten
        (for [x (range 100 1000)]
          (map
           #(if (= (str (* x %)) (apply str (reverse (str (* x %)))))
              (* x %)
              0)
           (range x 1000))))))

我得到了以下内容:
(apply
 max
 (flatten
  (for
   [x (range 100 1000)]
   (map
    (fn*
     [p1__13958#]
     (if
      (=
       (str (* x p1__13958#))
       (apply str (reverse (str (* x p1__13958#)))))
      (* x p1__13958#)
      0))
    (range x 1000)))))

据我所知,lambda表达式中的 #(...) 表示是一个“读取器宏(reader macro)”。那么如何在不触发宏扩展的情况下进行漂亮打印呢?更一般地说,如何漂亮打印“我在文本编辑器中看到的内容”?
此外,几乎所有东西都换行是正常的吗?例如:
(apply
 max
 (flatten
  (for
   [x (range 100 1000)]
   (map
    ...

看起来占用了相当多的垂直屏幕空间,这是Lisp代码应该缩进的方式吗?

最后一个相关问题:Emacs是否可以配置为“漂亮地打印”选定区域或整个.clj缓冲区?

3个回答

3

没有官方的缩进Lisp代码的方式,但我喜欢clojure-mode缩进clojure代码的方式(见下文)。

我不知道pprint为什么会按照它的方式打印代码,但根据this页面,这是一个早期版本,还没有完整的功能。

对于emacs缩进部分,您可能需要查看clojure-mode


没有“官方”的方法来缩进Lisp代码。啊...我以为有一种方法。或者至少有一种“文化上”被接受的方式。例如,似乎广泛认为永远不应该将闭合括号放在新行上:没有一个“漂亮的打印机”这样做,几乎没有由知识渊博的Lisp程序员编写的Lisp代码这样做。如果没有“官方”标准,那么我想知道格式化Lisp代码的“最常见”方式;) - Cedric Martin
2
Clojure-mode的缩进可能与此相似。它与clojure.org和许多库中使用的缩进基本相同。 - Daan

2

最接近共识的方式是“像Emacs一样缩进”,我想为了政治正确性,我应该包括“像vim一样缩进”的推论。其他编辑器如eclipse+CCW似乎与此相当接近。尽管默认的漂亮打印机会添加更多的换行符。


我+1了,但是...为什么pprint会展开lambda?这是它应该的工作方式吗? - Cedric Martin

0

这是我目前正在做的事情:

(defn pprint-code [code]
  (with-pprint-dispatch code-dispatch
    (binding [*print-suppress-namespaces* true]
      (pprint code))))

注意:查看clojure.pprint以解决free-vars。

这确实是一个改进。我仍然不知道如何调整*print-miser-width*和/或*print-right-margin*以获得更好的输出。你的情况可能有所不同。我目前的问题是(auto-)gensyms - 我希望在某些上下文中pprinting时对它们进行解缩。

理想情况下,表单/函数可以定义自己的格式规则,例如,let-bindings应始终位于单独的行上。我不知道是否可以使用clojure.core来实现此功能。

有关参考,请参见概述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接