简而言之,阅读器宏(reader macros)为您提供在一些限定上下文中重新定义编程语言语法的能力。例如,使用阅读器宏,您可以实现正则表达式字面量(例如#"pattern")。如果没有它们,您将被迫在传递给re-pattern的字符串字面量中正确转义正则表达式。顺便说一句,虽然没有公共的Clojure API用于修改阅读器,但是这些文章中所示的方法并非不可能。 http://briancarper.net/blog/449/clojure-reader-macros http://fulldisclojure.blogspot.com/2009/12/how-to-write-clojure-reader-macro.html
一个简单的例子。Common Lisp中,向量使用 #() 语法而不是 []。但是通过创建自定义阅读器宏,您可以将 [2 3 4 5] 转换为 Common Lisp 中的向量。由于大多数用户可能对已创建的阅读器宏的含义不太清楚,因此它们很少使用。为了避免混淆,Rich Hickey决定在Clojure中删除了用户定义阅读器宏的能力。然而,Clojure有预定义的阅读器宏- 引用、向量、正则表达式、映射等等。
在Common Lisp中,reader是可由用户扩展的,使用读取宏来读取s-expressions。 Reader负责读取Lisp数据类型(如数字、字符串、符号、列表、conses、结构、数组、字符等)的外部文本语法。Reader不负责Lisp编程语言的语法 - 只负责的语法。 因此,从用户角度来看,读取宏的主要目的是扩展或更改s-expressions的语法。例如,用户可以添加各种CLOS类(如URL等)、哈希表、特殊标识符、新的数字类型等的文本语法。有时还用于嵌入其他语言/语法的语法,这些语言/语法具有形成标记的不同规则:嵌入SQL、嵌入C、中缀表达式、嵌入Objective C调用、嵌入规则语言、嵌入XML、嵌入JSON等。另一个用途是允许用户对reader实际读取的s-expressions具有额外的控制。例如条件功能表达式。因此,用户可编程的读取宏允许用户根据上述功能自定义读取器。可以想象,这对于那些想在数据语法/令牌级别上自定义语言的用户非常有用,但它增加了另一层复杂性。