http://pastebin.com/d2294a374
我在那里发布了以不同方式缩进的代码.我在这里感到困惑,因为当一个函数有多个参数时我不知道该怎么做.每个论点应该在不同的行还是相同?此外,当我们有类似的东西时(def xyz(fn abc [a1 a2] ...)(fn abc ...进入另一条线?
我正在阅读http://mumble.net/~campbell/scheme/style.txt中的以下内容,但它似乎对我没有多大意义.
**缩进和对齐
任何形式的操作员,即开口圆括号后面的第一个子表单,确定缩进或对齐其余表格的规则.此位置的许多名称表示特殊对齐或缩进规则; 这些是具有特定参数结构的特殊运算符,宏或过程.
但是,如果第一个子表单是非特殊名称,则如果第二个子表单位于同一行,则将所有后续子表单的起始列与第二个子表单的起始列对齐.如果第二个子表单位于以下行,则将其起始列与第一个子表单的起始列对齐,并对所有剩余的子表单执行相同的操作.
通常,Emacs将正确缩进Lisp代码.在任何代码上运行`CMq'(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))
基本原理:柱状对齐允许读者直接跟踪任何操作的操作数,只需向下或向上扫描以匹配公共列.缩进决定了结构; 令人困惑的缩进对于希望在没有手动匹配括号的情况下派生结构的读者来说是一种负担.
如果参数在多行上(例如因为它们不适合一行),它们应该都具有相同的缩进.如果将第一个参数放在一个新行上,那么该缩进应该比函数本身更深(例如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)))