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

标签 syntax clojure

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center寻求指导。




9年前关闭。




好像一切 clojure 中需要用括号括起来。偶a simple hello world !

(println "Hello world!")

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

最佳答案

根本原因是 Clojure 被设计为 homoiconic语言,即代码以该语言的核心数据结构表示。所有的 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# 中的等效代码少
  • 关于syntax - 为什么 Clojure 语言使用这么多括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11391731/

    相关文章:

    arrays - OCaml 中的 a.{X} 是什么意思?

    Javascript事件语法问题

    clojure - 如何从 clojure leiningen 项目中删除未使用的依赖项?

    clojure - 转换器如何在 core.async channel 中执行?

    mysql - clostache/render 函数中是否有多个参数?

    javascript - new MyFunction() 与 new(MyFunction)

    php - 检查 PHP 文件的语法错误

    syntax - 从历史上看,为什么反斜杠 (\) 是转义字符?

    clojure - 为什么 Leiningen 会陷入顶层空洞的 future ?

    python - 纬度/经度集中的最短总路径