三种 lispy 谐音语言,Dylan , Julia和 Seph全部从前导括号移开 - 所以 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/