我最近一直在使用Clojure,但我仍然不明白我没有得到常见lisp阅读器宏提供的功能。你能简单地给我解释一下吗?
简而言之,阅读器宏为您提供了在某些分隔的上下文中重新定义编程语言语法的能力。
例如,您可以在给定的读取器宏中自己实现正则表达式字面量(例如#"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
一个简单的例子。普通Lisp对于vector #()有不同的读取器语法,而不是[]。但是,通过创建自定义读取器宏的能力,您也可以使用读取器宏将[2 3 4 5]转换为Common Lisp中的向量。
由于大多数用户不会意识到自己创建的读取器宏的含义,因此很少使用它们,为了避免混淆,Rich Hickey决定在Clojure中删除用户定义读取器宏的功能。但是,Clojure有预定义的读取器宏——quote、vector、regex、map等
在Common Lisp中,阅读器可以通过阅读器宏进行用户扩展。阅读器负责读取s表达式。 s表达式是Lisp数据类型的外部文本语法,如数字、字符串、符号、列表、序列、结构、数组、字符等
阅读器不负责编程语言Lisp的语法——只负责s表达式。因此,从用户的角度来看,reader宏的主要目的是扩展或更改s表达式的语法。例如,用户可以为各种CLOS类(如url,…),散列表,特殊标识符,新数字类型,…添加文本语法
有时也用于嵌入其他语言/语法的语法,这些语法有不同的规则来形成标记:嵌入式SQL,嵌入式C,中缀表达式,嵌入式对Objective C的调用,嵌入式规则语言,嵌入式XML,嵌入式JSON等等。
的另一个用途是允许用户对s表达式有额外的控制,阅读器实际读取。例如条件特征表达式。
因此,用户可编程阅读器宏允许用户根据上述功能定制阅读器。可以想象,对于那些想要在数据语法/标记级别定制语言的用户来说,这是有用的,但它增加了另一层复杂性。