我发布的代码以两种不同的方式缩进。我在这里感到困惑,因为当一个函数有多个参数时我不知道该怎么做。每个论点应该在不同的行还是相同?此外,当我们有类似的东西时(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))
理由:柱状对齐允许读者遵循 任何操作的操作数都是直接的,只需扫描即可 向下或向上以匹配公共列。缩进决定 结构体;令人困惑的缩进是希望读者的负担 导出结构而不手动匹配括号。
答案 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)))