clojure终止括号语法

时间:2015-05-11 12:47:13

标签: clojure compiler-construction parentheses

表达式有什么理由

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

不能替换为

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

之类的,然后扩大回来?

我知道缺少读者宏意味着你无法改变语法,但这种扩展是否可以硬编码到java中?

当我手写代码时,我这样做。

2 个答案:

答案 0 :(得分:4)

是的,你可以这样做,即使没有读者宏(事实上,你可以通过一些黑客来改变Clojures语法)。

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

最终,如果你真的不喜欢所有关闭的parens,为什么不使用

(-> arg foo1 foo2 foo3 foo4) 

代替?

答案 1 :(得分:2)

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

这样的建议往往是编写工具不良和编写代码的“传统”概念模型的结果。选择正确的工具并从略微不同的角度查看代码通常会消除导致此类建议的原因。

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

lisp风格的语言不那么专注于令牌行。这里的重点是列表表格。标记行替换为嵌套的符号列表 - 该行不太相关,您通常需要更多的表单嵌套。这种变化意味着您的标准面向行的工具(如编辑器)不太适合。作为标记行的代码的典型心理模型也不太有用。

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

一旦你的编辑理解列表是基本的分组单元,而不是行,那么像括号这样的东西在代码编写/编辑方面变得无关紧要。您不必担心关闭括号,计算括号嵌套级别等。这一切都由编辑器自动管理。你不按行移动,按列表移动,不删除/删除行,删除列表,不剪切和复制行块,剪切和复制列表列表等。

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

我怀疑你的建议是为了避免必须输入多个右括号而有一点额外的语法糖实际上是没有合适的工具来编写代码的症状。一旦你这样做,你几乎永远不需要输入一个右括号或计算开放的parens来确保你得到正确的嵌套。这将由编辑处理。您最大的挑战将是改变您的心理模型,以便根据列表和列表列表进行思考。 parens将变得基本上不可见,你将根据列表单位而不是行单位在代码中跳转。改变并不容易,重新训练你的大脑和手指可能需要一些时间,但是一旦你这样做,你可能会对你开始编辑和操作代码的速度感到惊讶。

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