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