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

时间:2012-07-09 08:47:53

标签: syntax clojure

似乎所有需要包装在clojure的括号中。甚至是a simple hello world

(println "Hello world!")

该语法决定有什么好处?

3 个答案:

答案 0 :(得分:22)

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

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

(function arg1 arg2 arg3) => some result

这有很多好处:

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

函数名可以放在括号之外:

function (arg1 arg2 arg3) => some result

但这会有许多缺点:

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

答案 1 :(得分:10)

Clojure是怎样的

(println "Hello world!")

不同
println("Hello world!")

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

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

答案 2 :(得分:7)

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