(归功于 andrew cooke 的回答,他提供了 Wheeler 和 Gloria 的“Readable Lisp S-expressions Project”的链接)
上面的链接是一个项目,旨在为所有基于 s 表达式的语言提供可读的语法,包括 Scheme 和 Clojure。结论是它是可以做到的:有一种方法可以让 Lisp 不带括号可读。
基本上,David Wheeler 的项目所做的就是向类 Lisp 语言添加语法糖,以提供更现代的语法,同时不会破坏 Lisp 对特定领域语言的支持。这些增强功能是可选的并且向后兼容,因此您可以根据需要包含尽可能多或尽可能少的增强功能,并将它们与现有代码混合使用。
该项目定义了三种新的表达式类型:
- 卷曲中缀表达式。 (+ 1 2 3)在您想使用任何数量的中缀运算符的每个地方都变为 {1 + 2 + 3} 。(如果内联表达式使用多个运算符,例如 {1 + 2 * 3} - 尽管 {1 + {2 * 3} } 按预期工作,则需要小心处理特殊情况)。
- 新时代的表达。(fxy) 变成 f(xy)(要求函数名和它的参数之间没有空格)
- 甜蜜的表情。打开和关闭括号可以替换为(可选)类似 python 的语义缩进。Sweet-expression 可以与传统的括号 s-expression 自由混合。
结果是与 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
请注意语法如何与宏兼容,这是以前旨在改进 Lisp 语法的项目的问题(如 Wheeler 和 Gloria 所述)。因为它只是糖,每个新表达式的最终形式是一个 s 表达式,在处理宏之前由语言阅读器转换 - 所以宏不需要任何特殊处理。因此,“可读 Lisp”项目保留了同音性,即允许 Lisp 将代码表示为语言中的数据的属性,这使得它成为一个强大的元编程环境。