18

似乎所有内容都需要用 clojure 的括号括起来。即使是一个简单的hello world

(println "Hello world!")

这种语法决定有什么好处?

4

3 回答 3

25

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

在 Lisp 设计的早期就做出了选择,列表将用于函数调用,形式如下:

(function arg1 arg2 arg3) => some result

这有很多优点:

  • 函数调用表示为称为“表单”的单个数据对象(在这种情况下,表单是列表,但它也可以是向量、哈希图、文字值等)。您可以在执行前根据需要传递、修改和转换它。
  • 使用标准列表操作很容易构造这样的函数调用- 例如(cons function-symbol list-of-args)
  • 语法很容易解析——两个括号之间的所有内容都是一个独立的表达式。这使得编写解析器变得容易,并且还有助于使用工具(例如,请参阅 emacs 中令人难以置信的数组处理命令)

函数名可以放在括号外:

function (arg1 arg2 arg3) => some result

但这会有很多缺点:

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

Clojure的怎么样

(println "Hello world!")

任何不同于

println("Hello world!")

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

括号分隔函数调用(作为列表)。在类 C 语言中,括号仅包含参数,而在类 LISP 语言中,括号包含函数名称。

于 2012-07-09T08:49:57.620 回答
8

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

于 2012-07-09T08:52:13.917 回答