我最近一直在使用 Clojure,但我仍然不明白我没有得到常见的 lisp 阅读器宏提供的功能。可以用简单的方式向我解释一下吗?
3 回答
简而言之,阅读器宏使您能够在某些分隔的上下文中重新定义编程语言的语法。
例如,您可以在#"pattern"
给定阅读器宏的情况下自己实现正则表达式文字(例如 )。如果没有它们,您将被迫正确转义传递给re-pattern
.
顺便说一句,虽然没有用于修改阅读器的公共 Clojure API,但这并非不可能,如以下帖子所示:
一个简单的例子。Common Lisp 对于向量 #() 而不是 [] 有不同的阅读器语法。但是通过创建自定义阅读器宏的能力,您可以拥有一个阅读器宏,它也可以将 [2 3 4 5] 转换为 Common Lisp 中的向量。
由于大多数用户不会知道所创建的阅读器宏的含义,因此它们很少使用,并且为了完全避免混淆,Rich Hickey 决定删除在 Clojure 中拥有用户定义阅读器宏的能力。然而,Clojure 有预定义的阅读器宏 - 引用、向量、正则表达式、地图等
在 Common Lisp 中,阅读器可以通过阅读器宏进行用户扩展。读者负责阅读s -expressions。S 表达式是 Lisp 数据类型(如数字、字符串、符号、列表、conses、结构、数组、字符等)的外部文本语法。
读者不对编程语言 Lisp的语法负责——只对s-expressions负责。
因此,从用户的角度来看,阅读器宏的主要目的是扩展或更改 s 表达式的语法。例如,用户可以为各种 CLOS 类(如 URL、...)、哈希表、特殊标识符、新数字类型等添加文本语法。
有时它也用于嵌入其他语言/语法的语法,这些语言/语法有不同的规则来形成标记:嵌入式 SQL、嵌入式 C、中缀表达式、对 Objective C 的嵌入式调用、嵌入式规则语言、嵌入式 XML、嵌入式 JSON 等等。
另一个用途是允许用户对读者实际阅读的 s 表达式进行额外控制。例如条件特征表达式。
因此,用户可编程阅读器宏允许用户根据上述功能定制阅读器。可以想象这对于那些想要在数据语法/令牌级别自定义语言的用户很有用,但它增加了另一层复杂性。