编辑我不只是询问“缩进”每一行代码,而是关于“漂亮打印”和/或更广泛的“缩进”定义,其中行将是根据它们包含的内容进行分组/拆分。
这是一个函数(我写的是为了解决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 缓冲区吗?
答案 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。