通常代码如下:
(one-thing
(another-thing arg1 (f arg5 r))
(another-thing arg1 (f arg5 r)))
为什么不喜欢这样?:
(one-thing
(another-thing arg1 (f arg5 r))
(another-thing arg1 (f arg5 r))
)
它允许更容易地添加和删除“Another-thing”行(不删除和重新添加尾部右括号)。你也可以在那个单独的右括号上加上一些注释(例如“;循环结束”)。
当我使用第二种风格的代码与使用第一种风格的现有代码混合时有多糟糕?
答案 0 :(得分:45)
在Lisp和其他使用S表达式语法的语言中,括号主要是为了编译器的利益,而布局和缩进(编译器忽略它们)是为了程序员的利益。
所以没有必要在它们自己的行上加上右括号:精心选择的换行符和缩进就足以使结构清晰。
例如,
(defun clone-indirect-buffer-other-window (newname display-flag &optional norecord)
"Like `clone-indirect-buffer' but display in another window."
(interactive
(progn
(if (get major-mode 'no-clone-indirect)
(error "Cannot indirectly clone a buffer in %s mode" mode-name))
(list (if current-prefix-arg
(read-buffer "Name of indirect buffer: " (current-buffer)))
t)))
(let ((pop-up-windows t))
(clone-indirect-buffer newname display-flag norecord)))
结构清晰(对于经验丰富的Lisp程序员)来自缩进。通过将一些右括号放到新行上,不会添加任何内容:
(defun clone-indirect-buffer-other-window (newname display-flag &optional norecord)
"Like `clone-indirect-buffer' but display in another window."
(interactive
(progn
(if (get major-mode 'no-clone-indirect)
(error "Cannot indirectly clone a buffer in %s mode" mode-name)
)
(list (if current-prefix-arg
(read-buffer "Name of indirect buffer: " (current-buffer))
)
t)
)
)
(let ((pop-up-windows t))
(clone-indirect-buffer newname display-flag norecord)
)
)
我应该补充说,几乎所有Lisp程序员都使用一个显示匹配括号的编辑器,执行自动缩进,并提供一个用户界面,用于直接使用平衡表达式。例如,在Emacs中,有 M - (用于插入新表达式, M - ),用于移过当前表达式的末尾, CMk 用于删除点后的表达式,依此类推。
所以Lisp程序员不必手动计算括号,以找出哪些匹配。
Taylor R. Campbell雄辩地表达了这个理由:
实际的括号字符只是词汇标记,应该赋予它很少的意义。 Lisp程序员不会单独检查括号,或者,Azathoth禁止计数括号;相反,他们会查看程序中表达的更高级别的结构,尤其是缩进所呈现的结构。 Lisp不是要编写一系列串行指令;它是通过对零件进行求和来构建复杂的结构。部件中复杂结构的组合是Lisp程序的重点,从Lisp代码中可以很容易地看出它。随意放置关于演示文稿的括号对于Lisp程序员来说是不和谐的,否则他们甚至都不会在大多数情况下看到它们。
答案 1 :(得分:29)
这里有两点要点:
公约本身很重要。坚持包裹的parens意味着你的代码更容易被其他lisp程序员阅读,如果你采用这种风格,你也会开始练习阅读他们的
将)
分割到自己的线上的好处实际上并不是大多数lispers眼中的优势。如果你使用的是一个不太合适的编辑器,那么它将具有理解平衡表达式,移动它们,剪切,粘贴,移调等的命令。所以你不需要
) ; end of the loop
在lisp中不仅仅是你需要的
# end of the loop
在像Python这样的空白敏感语言中
参见例如http://www.gnu.org/software/emacs/manual/html_node/emacs/Expressions.html
答案 2 :(得分:11)
简短回答:偏离公认标准只会疏远潜在的贡献者。没有一种风格比另一种更好。
答案 3 :(得分:3)
做你喜欢的事!这是你的代码。
那就是说,你最终可能会将它们全部移回去,以便你可以立刻在屏幕上获得更多东西。确实,你有一段时间后有效地停止看到括号。
实际上,它有点糟糕。这些天,当我尝试使用心爱的python时,感觉就像我的代码在没有括号的情况下没有安全地绑在一起,我担心它可能随时会崩溃。
地狱,记录几个键盘宏,将整个文件从一种风格交换到另一种风格。 (并学习如何使您的版本控制忽略仅限空格的变化。: - )
答案 4 :(得分:3)
如果您使用的是Emacs,则需要才能了解these。特别是,C-M-k
使得杀死平衡表达式就像杀死一条线一样容易。结合平衡括号的良好突出,并且实际上没有必要以这种方式写东西。
另一方面,将所有这些)
单独放在行上意味着您可以同时在屏幕上看到较少的代码,从而使其更难以阅读和重构。
如果你没有使用Emacs,你至少应该使用支持这些基本操作的编辑器,或者在lisp中编码会很痛苦。
答案 5 :(得分:1)
保存垂直屏幕(和眼睛)的房地产空间非常重要。
答案 6 :(得分:1)
我认为对此有一个好的答案是提出一个相关的问题:
为什么Python程序员不会将关闭嵌套的字形放在自己的行上?
现在答案很明显:没有这样的字形。事实证明在Lisp中也没有这样的字形:是的,Lisp读者需要这些有点令人烦恼的(
和)
字符,但是人类做了不读这样的Lisp代码:他们用缩进和单词来读它。
答案 7 :(得分:1)
括号不是为了便于阅读,它们适用于计算机。程序员可以通过查看缩进来查看代码块的结束位置。此外,有多个右括号共享一行意味着程序员可以在屏幕上一次查看更多代码。