这个Clojure代码是否正确缩进?

时间:2009-12-15 01:54:10

标签: coding-style clojure lisp indentation

http://pastebin.com/d2294a374

我发布的代码以两种不同的方式缩进。我在这里感到困惑,因为当一个函数有多个参数时我不知道该怎么做。每个论点应该在不同的行还是相同?此外,当我们有类似的东西时(def xyz(fn abc [a1 a2] ...确实(fn abc ...进入另一条线?

我正在阅读http://mumble.net/~campbell/scheme/style.txt中的以下信息,但这似乎对我没有多大意义。

**缩进和对齐

任何形式的运营商,即开幕后的第一个子表格 圆括号,确定缩进或对齐的规则 剩下的表格。这个位置的许多名字都表示特殊 对齐或缩进规则;这些是特殊的运算符,宏或 具有某些参数结构的程序。

如果第一个子表单是非特殊名称,那么如果第二个子表单是非特殊名称 子表单位于同一行,对齐所有后续的起始列 子表单与第二个子表单的子表单。如果第二个子表单已打开 在以下行中,将其起始列与第一行对齐 子表单,并对所有剩余的子表单执行相同的操作。

通常,Emacs会正确缩进Lisp代码。跑'C-M-q' (indent-sexp)在任何代码上,以确保它正确缩进,和 配置Emacs以便缩进任何非标准表单 适当。

×:

(+ (sqrt -1)
  (* x y)
  (+ p q))

(+
   (sqrt -1)
   (* x y)
   (+ p q))

可接受:

(+ (sqrt -1)
   (* x y)
   (+ p q))

(+
 (sqrt -1)
 (* x y)
 (+ p q))

理由:柱状对齐允许读者遵循   任何操作的操作数都是直接的,只需扫描即可   向下或向上以匹配公共列。缩进决定   结构体;令人困惑的缩进是希望读者的负担   导出结构而不手动匹配括号。

1 个答案:

答案 0 :(得分:10)

如果参数在多行上(例如因为它们不适合一行),它们都应该具有相同的缩进。如果你把第一个参数放在一个新行上,那个缩进应该比函数本身更深(例如2个空格):

(foo (bar (baz
            arg1
            arg2)))

如果你把第一个参数放在与函数相同的行上,其余的应该有相同的缩进:

(foo (bar (baz arg1
               arg2)))

我将您的示例缩进如下:

(defn get-neighbors [[x y] v]
  (for [y1 (range (dec y) (+ y 2))
        x1 (range (dec x) (+ x 2))
        :when (and (not (and (= x1 x)
                             (= y1 y)))
                   (in-bounds? x1 y1 v))]
    ((v y1) x1)))