4

编辑我不只是询问“缩进”每一行代码,而是询问“漂亮的打印”和/或更广泛的“缩进”定义,其中行将根据它们包含的内容进行分组/拆分。

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

手动缩进的版本:

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

显然,这不是一种真正的 Lisp 缩进/打印风格,而且我想从一开始就养成良好的习惯,我尝试“漂亮地打印”它,从 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 的#(...)表示法是“阅读器宏”。那么如何在不触发宏扩展的情况下进行漂亮的打印呢?更一般地说:我怎样才能漂亮地打印“我在文本编辑器中看到的内容”?

另外,几乎所有事情都在新的路线上进行是否正常?例如:

(apply
 max
 (flatten
  (for
   [x (range 100 1000)]
   (map
    ...

似乎浪费了相当多的垂直屏幕空间。这是Lisp 代码应该缩进的方式吗?

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

4

3 回答 3

3

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

我不知道为什么 pprint 以它的方式打印代码,但根据这个页面,它是一个尚未完成功能的早期版本。

对于 emacs 缩进部分,您可能想看看clojure-mode

于 2012-05-02T10:53:14.760 回答
2

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

于 2012-05-02T20:15:14.273 回答
0

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

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

注意:查看 clojure.pprint 以解析免费变量。

这当然是一种改进。我仍然不完全知道如何调整*print-miser-width*和/或*print-right-margin*获得更好的输出。YMMV。我目前的牛肉是(自动)gensyms - 我希望它们在某些情况下打印时被去除。

理想情况下,表单/函数可以定义自己的格式化规则,例如 let-bindings 应该总是在不同的行上。我不知道能够用 clojure.core 做到这一点。

如需参考,请参阅此概述

于 2014-07-04T06:06:08.430 回答