漂亮的印刷和扩展

时间:2012-05-02 10:29:05

标签: emacs macros clojure read-eval-print-loop pretty-print

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

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

手动缩进版本:

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

显然这不是真正的Lisp缩进/打印风格,因为我想从一开始就养成良好的习惯,我试着“漂亮地打印”它,从Emacs的粘液做以下操作-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 缓冲区吗?

3 个答案:

答案 0 :(得分:3)

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

我不知道为什么pprint按照它的方式打印代码但是根据this页面,它是一个尚未完成特征的早期版本。

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

答案 1 :(得分:2)

我最接近达成共识的是"像Emacs那样缩进",我认为在光谱上是正确的我应该包括推论"缩进它像vim那样"。像eclipse + CCW这样的其他编辑似乎相当匹配。虽然默认漂亮的打印机添加了更多的换行符。

答案 2 :(得分: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*以获得更好的输出。因人而异。我目前的牛肉是(自动)gensyms - 我希望它们在某些情况下进行打字,然后进行打印。

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

供参考,请参阅此overview