clojure - 如果像 Dylan、Julia 和 Seph 那样放弃前导括号,Clojure 会失去什么?

标签 clojure lisp julia language-design dylan

三种 lispy 谐音语言,Dylan , JuliaSeph全部从前导括号移开 - 所以 Common Lisp 中的假设函数调用看起来像:

(print hello world)

看起来像下面假设的函数调用

print(hello world)

上面提到的三种语言。

如果 Clojure 走这条路——它需要牺牲什么才能到达那里?

推理: 除了 Clojure 中惊人的惰性函数数据结构、改进的 maps 和 seqs 语法、对并发的语言支持、JVM 平台、工具和令人敬畏的社区——它作为“一个 LISP”的独特之处在于前导括号赋予同象性,这赋予宏提供语法抽象。

但是如果您不需要前导括号 - 为什么要有它们呢?我能想到的保留它们的唯一论据是

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

(2) 促使人们“用 LISP 思考”,而不是尝试将其视为另一种程序语言)

最佳答案

(归功于 andrew cooke 的回答,他提供了 Wheeler 和 Gloria 的 "Readable Lisp S-expressions Project" 的链接)

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

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

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

  • Curly-infix-expressions。 (+ 1 2 3) 在您想要使用任何数量的中缀运算符的每个地方变为 {1 + 2 + 3}。 (如果内联表达式使用多个运算符,例如 {1 + 2 * 3} - 虽然 {1 + {2 * 3} } 可以按预期工作,但有一种特殊情况需要小心处理)。
  • 近代表达式。 (f x y) 变成 f(x y)(要求函数名和它的参数之间没有空格)
  • 甜言蜜语。左括号和右括号可以替换为(可选)类似 python 的语义缩进。 Sweet-expressions 可以与传统的括号 s-expressions 自由混合。

结果是符合 Lisp 但可读性更高的代码。新语法糖如何增强可读性的示例:

(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

注意语法如何与宏兼容,这是 previous projects that intended to improve Lisp syntax 的问题(如 Wheeler 和 Gloria 所述)。因为它只是糖,每个新表达式的最终形式是一个 s 表达式,在处理宏之前由语言阅读器转换——因此宏不需要任何特殊处理。因此,“可读 Lisp”项目保留了同象性,即允许 Lisp 在语言中将代码表示为数据的属性,这使其成为一个强大的元编程环境。

关于clojure - 如果像 Dylan、Julia 和 Seph 那样放弃前导括号,Clojure 会失去什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9533139/

相关文章:

Julia :追加到一个数组

functional-programming - defmulti vs defmethod 有什么区别?在 clojure 中

clojure - 从另一个容器连接到在 Docker 容器中运行的 headless nREPL

lisp - Common Lisp 中的逗号-逗号-at

lisp - lisp有什么不同

julia - Julia 程序的基本结构是什么?

clojure - 使用 Datomic 返回 Map 而不是 Vector 时出错

Clojure 和 leiningen : declare and require namespace

c - 对于 C 开发人员来说,学习 LISP 最快、最不痛苦的方法是什么?

julia - 将 x.xxxxxxe-x*10^xx 形式的两个数字相乘不能正常工作