15

我最近一直在使用 Clojure,但我仍然不明白我没有得到常见的 lisp 阅读器宏提供的功能。可以用简单的方式向我解释一下吗?

4

3 回答 3

11

简而言之,阅读器宏使您能够在某些分隔的上下文中重新定义编程语言的语法。

例如,您可以在#"pattern"给定阅读器宏的情况下自己实现正则表达式文字(例如 )。如果没有它们,您将被迫正确转义传递给re-pattern.

顺便说一句,虽然没有用于修改阅读器的公共 Clojure API,但这并非不可能,如以下帖子所示:

于 2011-04-21T16:35:50.390 回答
10

一个简单的例子。Common Lisp 对于向量 #() 而不是 [] 有不同的阅读器语法。但是通过创建自定义阅读器宏的能力,您可以拥有一个阅读器宏,它也可以将 [2 3 4 5] 转换为 Common Lisp 中的向量。

由于大多数用户不会知道所创建的阅读器宏的含义,因此它们很少使用,并且为了完全避免混淆,Rich Hickey 决定删除在 Clojure 中拥有用户定义阅读器宏的能力。然而,Clojure 有预定义的阅读器宏 - 引用、向量、正则表达式、地图等

于 2011-04-21T16:18:49.607 回答
7

在 Common Lisp 中,阅读器可以通过阅读器宏进行用户扩展。读者负责阅读s -expressionsS 表达式是 Lisp 数据类型(如数字、字符串、符号、列表、conses、结构、数组、字符等)的外部文本语法。

读者不对编程语言 Lisp的语法负责——只对s-expressions负责。

因此,从用户的角度来看,阅读器宏的主要目的是扩展或更改 s 表达式的语法。例如,用户可以为各种 CLOS 类(如 URL、...)、哈希表、特殊标识符、新数字类型等添加文本语法。

有时它也用于嵌入其他语言/语法的语法,这些语言/语法有不同的规则来形成标记:嵌入式 SQL、嵌入式 C、中缀表达式、对 Objective C 的嵌入式调用、嵌入式规则语言、嵌入式 XML、嵌入式 JSON 等等。

另一个用途是允许用户对读者实际阅读的 s 表达式进行额外控制。例如条件特征表达式。

因此,用户可编程阅读器宏允许用户根据上述功能定制阅读器。可以想象这对于那些想要在数据语法/令牌级别自定义语言的用户很有用,但它增加了另一层复杂性。

于 2014-04-22T10:29:49.130 回答