Common Lisp中的读取宏有哪些优势是Clojure所没有的?

15

我最近一直在使用Clojure,但我仍然不理解哪些功能是普通的Lisp读取宏无法提供的。你能简单地为我解释一下吗?

3个回答

11
简而言之,阅读器宏(reader macros)为您提供在一些限定上下文中重新定义编程语言语法的能力。
例如,使用阅读器宏,您可以实现正则表达式字面量(例如#"pattern")。如果没有它们,您将被迫在传递给re-pattern的字符串字面量中正确转义正则表达式。
顺便说一句,虽然没有公共的Clojure API用于修改阅读器,但是这些文章中所示的方法并非不可能。

10
一个简单的例子。Common Lisp中,向量使用 #() 语法而不是 []。但是通过创建自定义阅读器宏,您可以将 [2 3 4 5] 转换为 Common Lisp 中的向量。
由于大多数用户可能对已创建的阅读器宏的含义不太清楚,因此它们很少使用。为了避免混淆,Rich Hickey决定在Clojure中删除了用户定义阅读器宏的能力。然而,Clojure有预定义的阅读器宏- 引用、向量、正则表达式、映射等等。

7
在Common Lisp中,reader是可由用户扩展的,使用读取宏来读取s-expressionsReader负责读取Lisp数据类型(如数字、字符串、符号、列表、conses、结构、数组、字符等)的外部文本语法。Reader不负责Lisp编程语言的语法 - 只负责的语法。

因此,从用户角度来看,读取宏的主要目的是扩展或更改s-expressions的语法。例如,用户可以添加各种CLOS类(如URL等)、哈希表、特殊标识符、新的数字类型等的文本语法。
有时还用于嵌入其他语言/语法的语法,这些语言/语法具有形成标记的不同规则:嵌入SQL、嵌入C、中缀表达式、嵌入Objective C调用、嵌入规则语言、嵌入XML、嵌入JSON等。
另一个用途是允许用户对reader实际读取的s-expressions具有额外的控制。例如条件功能表达式。
因此,用户可编程的读取宏允许用户根据上述功能自定义读取器。可以想象,这对于那些想在数据语法/令牌级别上自定义语言的用户非常有用,但它增加了另一层复杂性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接