为什么Clojure语言使用这么多括号?

Chr*_*oph 16 syntax clojure

好像所有东西都需要用clojure中的括号括起来.即使是一个简单的问候世界!

(println "Hello world!")
Run Code Online (Sandbox Code Playgroud)

该语法决定有什么好处?

mik*_*era 22

根本原因是Clojure被设计为同源语言,即代码在语言的核心数据结构中表达.所有Lisps都共享此属性,但很少有其他语言可以.因此,Lisps的整个语言设计受到这一决定的强烈影响.

选择是在Lisp的设计早期做出的,列表将用于表单中的函数调用:

(function arg1 arg2 arg3) => some result
Run Code Online (Sandbox Code Playgroud)

这有很多优点:

  • 函数调用表示为称为"表单"的单个数据对象(在这种情况下,表单是列表,但它也可以是向量,散列映射,文字值等).您可以传递它,修改它并在执行之前根据需要进行转换.
  • 使用标准列表操作很容易构造这样的函数调用- 例如(cons function-symbol list-of-args)
  • 语法很容易解析 - 两个括号之间的所有内容都是一个自包含的表达式.这使得编写解析器变得简单,并且还有助于工具化(例如,参见emacs中令人难以置信的paren-handling命令数组)

函数名称可能已放在括号外:

function (arg1 arg2 arg3) => some result
Run Code Online (Sandbox Code Playgroud)

但这会有许多缺点:

  • 您无法再以单一形式表达函数调用.您必须传递两个单独的数据对象,即函数名称和参数列表.
  • 它会使语法更复杂 - 您需要额外的语法规则来将其识别为函数调用(例如参数之间的","之类的额外分隔符)
  • 代码生成会更难.Lisp从一开始就被设计为允许有效的代码生成 - 另一方面,如果您曾经尝试过生成C++源代码,那么您将会知道在没有以这种方式设计的语言中它有多难.
  • 它实际上并没有减少整体括号的数量.事实上,由于是一个非常简洁的语言,Clojure的通常最终比的Java/C#的等效代码括号


Eri*_*fer 10

Clojure是怎么回事?

(println "Hello world!")
Run Code Online (Sandbox Code Playgroud)

任何不同的

println("Hello world!")
Run Code Online (Sandbox Code Playgroud)

其他语言?仅在不同位置使用相同数量的括号.

parens分隔函数调用(作为列表).在类C语言中,parens仅包含参数,而在类似LISP的语言中,它们包含函数名称.

  • 所以你的问题应该是"为什么C语言和基于LISP的语言使用这么多括号?".;-)在一天结束时,它只是另一种分隔表达式.ML语言(如F#)使用其他分隔方式而不是括号.顺便说一句:你好世界是功能语言的一个相当不幸的例子.更有趣的是结合多个表达式的示例. (8认同)

Jef*_*ter 7

基于Lisp的语言使用s表达式(括号中的代码)作为代码和数据的基础.这非常强大,因为它为Lisp提供了一个独特的强大宏系统.另见homoiconcity.