clojure 终止括号语法

clojure terminating parenthesis syntax

表达式

有什么原因吗
(foo5 (foo4 (foo3 (foo2 (foo1 arg)))))

不能替换为

(foo5 (foo4 (foo3 (foo2 (foo1 arg)-)

之类的,然后展开回来?

我知道缺少 reader 宏意味着您无法更改语法,但是可以将此扩展硬编码到 java 中吗?

我手写代码的时候就是这样做的。

是的,即使没有 reader 宏,您也可以这样做(事实上,您可以通过一些修改来更改 Clojures 语法)。

但是,问题是,它会给你带来什么?它会一直扩展到顶级吗?但是,如果您将代码移至顶层或从顶层移出,则剪切和粘贴代码将失败。当然,所有使用 clojure 语法的工具都需要理解它。

最后如果你真的不喜欢所有的闭括号为什么不使用

(-> arg foo1 foo2 foo3 foo4) 

改为?

是的,这可以做到,但我不确定这是正确的解决方案,而且有许多负面影响可能会超过收益。

像这样的建议通常是编码工具不佳和 'traditional' 编写代码的概念模型的结果。选择正确的工具并从稍微不同的角度查看您的代码通常会消除导致此类建议的原因。

大多数非功能性、非 lispy 风格的语言都基于代码的令牌和行模型。您倾向于根据标记行来考虑代码,并且您倾向于在此基础上编辑代码。表达式的嵌套通常较少,行通常以某些标记终止,例如分号。同样,诸如您的编辑器之类的工具也具有已经发展到支持基于标记和行的编辑的功能。他们很擅长。

lisp 风格的语言不太关注标记行。这里的重点是列表形式。标记行替换为嵌套的符号列表 - 该行的相关性较低,并且您通常有更多的形式嵌套。此更改意味着您的标准面向行的工具,如您的编辑器,不太适合。代码作为标记行的典型心智模型也不太有用。

使用像 Clojure 这样的语言,您最好从列表形式而不是代码行的角度来思考。完成此转换后,您便开始寻找也可以按照这些方式对代码进行建模的工具。例如,您要么寻找专门设计用于处理数据列表而不是数据行的编辑器,要么寻找具有允许您处理列表的扩展的编辑器。

一旦您的编辑了解到列表是基本的分组单位,而不是行,从代码 writing/editing 的角度来看,括号之类的东西在很大程度上变得无关紧要。您不必担心右括号、计算括号嵌套级别等。这一切都由编辑器自动管理。你不按行移动,你按列表移动,你不 kill/delete 一行,你杀死一个列表,你不剪切和复制一行,你剪切和复制一个列表列表等等

好消息是,在许多方面,这些基于列表的代码表示结构实际上比大多数基于行的语言更容易操作。这主要是因为歧义或复杂性较少。规则的例外情况较少,而且规则本质上很简单。因此,许多为程序员设计的编辑器将支持这种编码风格以及难以在结构化程度较低的代码中实现的高级功能。

我怀疑您建议使用额外的语法糖来避免输入多个右括号实际上是没有合适的工具来编写代码的症状。完成后,您几乎不需要输入右括号或计算左括号来确保嵌套正确。这将由编辑器处理。你最大的挑战将是改变你的心智模式,用列表和列表的列表来思考。 parens 将在很大程度上变得不可见,您将根据列表单位而不是行单位在代码中跳转。改变并不容易,重新训练您的大脑和手指可能需要一些时间,但一旦您这样做,您可能会惊讶于您开始编辑和操作代码的速度有多快。

如果您是 emacs 用户,我强烈推荐 paredit 和 lispy 等扩展。如果您使用其他编辑器,请寻找 paredit 类型扩展。但是,由于这些是扩展,您还必须花一些时间训练自己使用扩展使用的任何键绑定 - 如果您仍然只是用箭头四处走动,那么拥有基于列表的出色代码导航的扩展是没有意义的键(除非是 emacs 并且您已重新绑定这些箭头键以使用 paredit 导航绑定)。