Clojure没有常见的lisp阅读器宏有什么优势?

Zub*_*air 14 clojure common-lisp s-expression reader-macro

我最近一直在使用Clojure,但我仍然不明白我没有得到那些常见的lisp阅读器宏提供的功能.可以用简单的术语解释一下这个吗?

cem*_*ick 10

简而言之,读取器宏为您提供了在某些分隔上下文中重新定义编程语言语法的能力.

例如,你可以#"pattern"自己给读者宏实现正则表达式文字(例如).没有它们,您将被迫在传递给的字符串文字中正确地转义正则表达式re-pattern.

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


Boz*_*sov 9

一个简单的例子.Common Lisp为向量#()而不是[]提供了不同的阅读器语法.但是,由于能够创建自定义阅读器宏,您可以使用一个阅读器宏来将[2 3 4 5]转换为Common Lisp中的向量.

由于大多数用户不会意识到读者宏的含义,因此很少使用它们并且为了避免混淆,Rich Hickey决定在Clojure中删除使用用户定义的读取器宏的能力.但是,Clojure预定义了读取器宏 - 引用,向量,正则表达式,映射等


Rai*_*wig 8

在Common Lisp中,读者是用户可扩展的读者宏.该阅读器是负责读取s表达式.S表达式是Lisp数据类型的外部文本语法,如数字,字符串,符号,列表,conses,结构,数组,字符,......

阅读器是不负责的编程语言Lisp语言的语法-只为s表达式.

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

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

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

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