如何美化lisp源代码?

时间:2012-08-29 07:22:41

标签: clojure scheme common-lisp

我的代码在这种语言中很多很长,如下所示

(defn check-if-installed[x] (:exit(sh "sh" "-c" (str "command -v " x " >/dev/null 2>&1 || { echo >&2 \"\"; exit 1; }"))))

(def Open-Action (action :handler (fn [e] (choose-file :type :open :selection-mode :files-only :dir ListDir :success-fn (fn [fc file](setup-list file)))) :name "Open" :key "menu O" :tip "Open spelling list"))

太可怕了。我想格式化它

(if (= a something)
    (if (= b otherthing)
        (foo)))

如何以更好的方式美化源代码?

3 个答案:

答案 0 :(得分:5)

真正的答案取决于您是否愿意自己插入换行符。很多系统 一旦你把它分成几行,你就可以用惯用的方式缩进这些行。

如果您不想想要手动插入它们,那么Racket会提供一个"漂亮的打印"做了你想要的一些事情:

#lang racket

(require racket/pretty)

(parameterize ([pretty-print-columns 20])
  (pretty-print '(b aosentuh onethunoteh (nte huna) oehnatoe unathoe)))

==>

'(b
  aosentuh
  onethunoteh
  (nte huna)
  oehnatoe
  unathoe)

...但我是第一个承认在正确位置插入换行很难的人,因为 换行符的选择与您希望人们阅读代码的方式有很大关系。

答案 1 :(得分:3)

我经常使用Clojure.pprint使生成的代码更适合人类。  它适用于报告认为它的目标是生成文本。如果你把新行放在自己的身上,那么clojure-mode emacs包中内置的格式会产生格式很好的Clojure。

答案 2 :(得分:2)

现在您可以使用Srefactor package

一些演示:

可用命令:

  • srefactor-lisp-format-buffer:格式化整个缓冲区
  • srefactor-lisp-format-defun:格式当前的defun游标位于
  • srefactor-lisp-format-sexp:格式化当前的性别光标。
  • srefactor-lisp-one-line:将同一级别的当前性别变为一行;使用前缀参数,递归地将所有内部性别变为一行。

Scheme变体不像Emacs Lisp和Common Lisp那样精致,但适用于简单和小型的sexp。如果有任何问题,请提交问题报告,我很乐意解决。