如果Clojure不再使用像Dylan、Julia和Seph这样的前导括号,会有什么损失?

如果Clojure不再使用像Dylan、Julia和Seph这样的前导括号,会有什么损失?,clojure,lisp,julia,language-design,dylan,Clojure,Lisp,Julia,Language Design,Dylan,三种lispy同音符号语言,所有语言都远离了前面的括号-因此在Common Lisp中假设函数调用如下所示: (print hello world) 看起来像下面假设的函数调用 print(hello world) 使用上述三种语言 如果Clojure沿着这条路走下去,它需要牺牲什么才能到达那里 理由: 除了Clojure中令人惊叹的惰性函数数据结构,以及maps和seqs的改进语法,对并发性的语言支持,JVM平台,工具和令人敬畏的社区之外,它作为“LISP”的独特之处在于领先的括号提供了同

三种lispy同音符号语言,所有语言都远离了前面的括号-因此在Common Lisp中假设函数调用如下所示:

(print hello world)
看起来像下面假设的函数调用

print(hello world)
使用上述三种语言

如果Clojure沿着这条路走下去,它需要牺牲什么才能到达那里

理由: 除了Clojure中令人惊叹的惰性函数数据结构,以及maps和seqs的改进语法,对并发性的语言支持,JVM平台,工具和令人敬畏的社区之外,它作为“LISP”的独特之处在于领先的括号提供了同源性,而同源性提供了宏提供语法抽象

但是如果你不需要前导括号,为什么要用它们呢?我能想到的保留它们的唯一理由是

(1) 在emacs中重用工具支持


(2) 提示人们“用LISP思考”,而不是试图将其视为另一种过程语言)

仅仅将函数调用的括号移动一个原子是不足以满足任何人的;人们会抱怨缺少中缀运算符、开始/结束块等。另外,你可能不得不在各种地方引入逗号/分隔符

如果这样的话,宏就很难正确地编写(如果编写的宏能够与您当时引入的所有新语法配合良好,那么可能会更加困难)。宏并不是一个好功能,你可以忽略它,或者让它变得更烦人;整个语言(像任何其他Lisp一样)都是建立在它们之上的。clojure.core中的大多数“用户可见”内容,包括let、def、defn等都是宏

Were Clojure to go down this path - what would it have to sacrifice to get there?
这种牺牲将通过创建列表来改变编写代码的感觉/心理模式。。或者更严格地说是“直接编写AST”


注意:正如其他答案中所提到的,还有其他一些问题会被忽略。

编写宏将变得更加困难,因为结构不再简单,您需要另一种方式来编码表达式的开始和停止位置,可以使用一些语法符号来标记表达式的开始和结束编写生成表达式的代码也许您可以通过添加类似于
)的内容来标记表达式的开头来解决此问题

从一个完全不同的角度来看,这段视频非常值得一看,它让人们更加熟悉lisps语法,这不会让人们更容易学习,而且如果它看起来很像,可能会让人产生误解

即使你完全不同意,这段视频也值得一小时。

我曾经编写C/C#/Java/Pascal代码,所以我强调Lisp代码有点陌生。但是这种感觉只持续几个星期——在相当短的时间后,Lisp风格会感觉非常自然,你会开始责骂其他语言的错误“不规则”语法:-)

Lisp语法有一个很好的理由。通过以单一形式收集函数和组成其参数的表达式,前导括号使代码在逻辑上更易于解析和读取

当你操作代码/使用宏时,重要的是这些形式:它们是你所有代码的构建块。因此,从根本上讲,把括号放在一个精确界定这些形式的地方是有意义的,而不是任意地把第一个元素留在形式之外。

代码就是数据“哲学使可靠的元编程成为可能。与具有复杂语法的Perl/Ruby相比,它们的元编程方法仅在非常有限的环境中可靠。Lisp元编程非常可靠,语言的核心依赖于它。这是因为代码和数据共享统一的语法(同源性的属性)。S表达式是实现这种一致性的方式

也就是说,在Clojure中有可能出现隐含括号的情况:

例如,以下三个表达式是等效的:

  • (第一(休息(休息[123456789]))
  • (>[123456789](休息)(休息)(第一))
  • (>[1 2 3 4 5 6 7 8 9]先休息)

  • 请注意,在第三个示例中,->宏可以在此上下文中推断括号,从而将其省略。有很多这样的特殊情况。一般来说,Clojure的设计错误在于括号较少。例如,参见在cond中省略括号的有争议的决定。Clojure在这个选择上是非常有原则和一贯的。

    你不需要牺牲任何东西。有一种经过深思熟虑的方法,完全透明,向后兼容,完全支持宏等。

    (归功于安德鲁·库克的回答,他提供了惠勒和格洛里亚的链接)

    上面的链接是一个项目,旨在为所有基于s表达式的语言(包括Scheme和Clojure)提供可读的语法。结论是,这是可以做到的:有一种方法可以让可读的Lisp不带括号


    David Wheeler的项目基本上是在类似Lisp的语言中添加语法糖,以提供更现代的语法,但不会破坏Lisp对特定领域语言的支持。这些增强是可选的,并且向后兼容,因此您可以根据需要包含尽可能多或尽可能少的增强,并将它们与现有代码混合使用

    此项目定义了三种新的表达式类型:

    • 卷曲中缀表达式(+1+2+3)在您想要使用任何算术的中缀运算符的每个位置变为{1+2+3}。(如果内联表达式使用多个运算符,例如{1+2*3}-尽管{1+{2},但有一种特殊情况需要小心处理
      (define (gcd_ a b)
          (let (r (% b a))
              (if (= r 0) a (gcd_ r a))))
      
      (define-macro (my-gcd)
          (apply gcd_ (args) 2))
      
      define gcd_(a b)
          let r {b % a}
              if {r = 0} a gcd_(r a)
      
      define-macro my-gcd()
          apply gcd_ (args) 2
      
      @foo{blah blah blah}
      
      (foo "blah blah blah")