其中一个花时间评论我关于Clojure/LISP语法的另一个问题的人指出我没有用标准的LISP方式编写我的示例代码.所以他很友好地重写了代码片段,这是一个很大的帮助.但它在我的脑海里提出了另一个问题.为什么这样:
(if (= a something) (if (= b otherthing) (foo)))
这是标准的LISP格式,可以使用这种形式:
(if (= a something) (if (= b otherthing) (foo) ) )
这是因为我的C++开发背景,我会天真地格式化这段代码的方式.我想知道后一种格式化是否有任何好处,或者它只是一种根深蒂固的标准(如QWERTY键盘).我不是要争论 - 我很难理解为什么第一种形式会更好.第二种形式帮助我更容易地看到代码结构.
额外行上的右括号对查看代码结构没有帮助,因为您可以从缩进级别获取相同的信息.但是,第二种形式占用了几乎两倍的行,迫使您在阅读代码时更频繁地滚动.
如果您需要更仔细地检查嵌套括号,则突出显示匹配括号的编辑器将对您有所帮助.当匹配的括号不太远时,这也会更容易.
如果表达式太长且太复杂而无法轻松阅读,那么也可能表明您应该将部分功能提取到单独的函数中.
Lisp代码缩进的方式有点像Python中的重要空白,除了它当然是可选的.基本的经验法则是,如果项目不在同一条线上,则将项目垂直放置在另一个列表中.
(a (b (c (d e) (f g)) (h i j)) (k l m n))
甚至没有查看括号,您可以看到,(d e)
并且(f g)
是参数c
,(c (d e) (f g))
并且(h i j)
是参数b
,(b (c (d e) (f g)) (h i j))
并且(k l m n)
是参数a
.
在您的示例中,它应该更正确地格式化如下:
(if (= a something) (if (= b otherthing) (foo))) ^ ^ notice how they line up
现在缩进的级别变得有意义了,你不再需要依赖平衡括号来获取那些信息,并且因为将它们放在与结束语句相同的行上更紧凑,这就是lispers所做的.当然,并不要求Lisp代码以这种方式格式化,但它是人们使用并且可以依赖的相当标准的约定.