2012-05-02 44 views
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的中做到以下几点: -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))))) 

据我了解的#(...)符号的拉姆达是一个“读者宏”。那么如何在不触发宏扩展的情况下打印出漂亮的图片呢?更一般地说:我怎样才能打印出“我在文本编辑器中看到的内容”?

另外,几乎所有事情都在一个新的线上正常吗?例如:

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

似乎是相当一些垂直屏幕房地产的浪费。这是方式Lisp代码应该缩进吗?

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

回答

3

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

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

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

+0

*“没有'官方'缩进lisp代码的方法没有”官方“缩进Lisp代码的方式”* ...啊......我以为有一个。或者至少是一种“文化上”接受的方式。例如,似乎人们普遍认为,不应该把一个新的关闭括号放在一个换行符上:没有一个“美丽的打印机”可以这样做,而且几乎没有任何由知识丰富的Lisp程序员编写的Lisp代码这样做。如果没有“官方”标准,那么我就是采用“最常见”的方式来格式化Lisp代码; ) –

+2

Clojure模式的缩进可能接近于此。它或多或少与clojure.org和许多库中使用的缩进相同。 – Daan

2

我所见到的最接近共识的是“像Emacs那样缩进它”,我认为是极其正确的,我应该包含这个推论“缩进它像vim一样”。像eclipse + CCW这样的其他编辑似乎与此相当接近。尽管默认的漂亮打印机添加了更多的换行符。

+0

I + 1'ed但仍...为什么* pprint *展开lambda?这是应该如何工作? –

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*以获得更好的输出。因人而异。我目前的牛肉是(自动)gensyms - 我希望它们在某些情况下打印时会被去毛刺。理想情况下,表单/函数可以定义它们自己的格式化规则,例如,让绑定应该总是在单独的行上。我不知道能用clojure.core做到这一点。

仅供参考,请参阅overview