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