Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coding style 在基于Lisp的语言中,为什么习惯于在一行上放许多右括号?_Coding Style_Clojure_Lisp_Parentheses - Fatal编程技术网

Coding style 在基于Lisp的语言中,为什么习惯于在一行上放许多右括号?

Coding style 在基于Lisp的语言中,为什么习惯于在一行上放许多右括号?,coding-style,clojure,lisp,parentheses,Coding Style,Clojure,Lisp,Parentheses,通常代码如下所示: (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)) ) 它允许更轻松地添加和删除“另一件事”行(无需删除和重新添加尾随的右括号)。此外,您还可以在这个单独的右括号上添加一些注释

通常代码如下所示:

(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))
)
它允许更轻松地添加和删除“另一件事”行(无需删除和重新添加尾随的右括号)。此外,您还可以在这个单独的右括号上添加一些注释(例如“循环结束”)


当我将使用第二种样式的代码与使用第一种样式的现有代码混合使用时,情况有多糟?

这里有两点需要说明:


  • 公约本身很重要。坚持使用包装的paren意味着你的代码更容易被其他lisp程序员阅读,如果你采用这种风格,你也可以练习阅读他们的代码

  • 在大多数Lisper眼中,将
    拆分到自己的行中的好处实际上并不是什么好处。如果您使用的是一个半体面的编辑器,它将具有理解平衡表达式的命令,用于在它们之间移动、剪切、粘贴、转置等,所以您不需要

    )  ; end of the loop
    
    在lisp中,您需要更多

    # end of the loop
    
    在一些对空格敏感的语言(如Python)中


  • 参见例如

    简短回答:偏离公认标准只会疏远潜在贡献者。没有一种风格比另一种更好


    长答案

    在Lisp和其他使用S表达式作为语法的语言中,括号主要用于编译器,而布局和缩进(编译器忽略)则用于程序员

    因此,没有必要在它们自己的行上加上右括号:选择好的换行符和缩进将足以使结构清晰

    比如说,

    (取消克隆间接缓冲区其他窗口(新名称显示标志和可选norecord)
    “类似于‘克隆间接缓冲区’,但显示在另一个窗口中。”
    (互动
    (项目
    (如果(获取主模式“无克隆间接”)
    (错误“无法在%s模式下间接克隆缓冲区”模式名称)
    (列表(如果当前前缀为arg
    (读取缓冲区“间接缓冲区的名称:”(当前缓冲区)))
    t) ))
    (let((弹出窗口t))
    (克隆间接缓冲区新名称显示标志norecord)))
    
    缩进中的结构非常清晰(对于经验丰富的Lisp程序员来说)。将一些右括号放到新行上不会添加任何内容:

    (取消克隆间接缓冲区其他窗口(新名称显示标志和可选norecord)
    “类似于‘克隆间接缓冲区’,但显示在另一个窗口中。”
    (互动
    (项目
    (如果(获取主模式“无克隆间接”)
    (错误“无法在%s模式下间接克隆缓冲区”模式名称)
    )
    (列表(如果当前前缀为arg
    (读取缓冲区“间接缓冲区的名称:”(当前缓冲区))
    )
    (t)
    )
    )
    (let((弹出窗口t))
    (克隆间接缓冲区新名称显示标志norecord)
    )
    )
    

    我应该补充一点,几乎所有的Lisp程序员都使用一个编辑器来显示匹配的括号,执行自动缩进,并提供一个用户界面来直接处理平衡表达式。例如,在Emacs中,有M-(用于插入新表达式,M-)用于移动到当前表达式的末尾,C-M-k用于删除点后的表达式,等等

    因此,Lisp程序员永远不必手动计算括号,以确定哪些括号匹配


    雄辩地表达了这一理由:

    实际的括号字符只是词法标记,不应赋予其任何意义。Lisp程序员不单独检查括号,或者Azathoth禁止计数括号;相反,他们查看程序中表达的更高级结构,尤其是缩进所呈现的结构。Lisp不是关于编写一系列串行指令;它是关于通过对各个部分求和来构建复杂结构的。由零件组成的复杂结构是Lisp程序的重点,从Lisp代码中可以很容易看出这一点。在演示文稿中随意放置括号会让Lisp程序员感到不安,否则他们大部分时间都不会看到括号


    做你喜欢做的!这是你的密码

    也就是说,你可能最终会将它们全部移回原处,这样你就可以一次在屏幕上看到更多的东西。确实,过了一段时间后,你实际上不再看到括号了

    事实上,比这更糟。现在,当我尝试使用心爱的python时,感觉我的代码没有括号就无法安全地绑定在一起,我担心它可能随时崩溃

    见鬼,录制几个键盘宏以将整个文件从一种样式切换到另一种样式。
    (并学习如何使您的版本控制忽略仅空白的更改。:-

    如果您使用的是Emacs,您需要学习。特别是,
    C-M-k
    使得删除一个平衡表达式就像删除一行一样简单。再加上突出显示平衡括号,就真的没有必要这样写了

    另一方面,让所有这些
    单独出现在屏幕上意味着您一次在屏幕上看到的代码更少,这使得阅读和重构变得更加困难


    如果您不使用Emacs,那么至少应该使用支持这些基本操作的编辑器,否则在lisp中编码将是一件痛苦的事情

    节省垂直屏幕(和眼睛)的房地产空间很重要。

    我认为一个好的答案是问一个相关的问题:

    为什么Python程序员不在他们自己的行上放置接近嵌套的标志符号

    现在的答案是显而易见的:没有这样的铭文。事实证明,在Lisp中也没有这样的符号:是的,有这些稍微令人讨厌的符号