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

常见的lisp阅读器宏有什么Clojure没有的优势?,clojure,common-lisp,s-expression,reader-macro,Clojure,Common Lisp,S Expression,Reader Macro,最近我一直在使用Clojure,但我仍然不明白我没有得到常见lisp reader宏提供的功能。你能简单地给我解释一下吗?一个简单的例子。Common Lisp对向量#()而不是[]有不同的读取器语法。但是,通过创建自定义读卡器宏的功能,您可以拥有一个读卡器宏,它也可以在Common Lisp中将[2 3 4 5]转换为向量 由于大多数用户不会意识到自己创建的读卡器宏的含义,因此很少使用它们,为了避免混淆,Rich Hickey决定取消在Clojure中使用用户定义的读卡器宏的功能。然而,Clo

最近我一直在使用Clojure,但我仍然不明白我没有得到常见lisp reader宏提供的功能。你能简单地给我解释一下吗?

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


由于大多数用户不会意识到自己创建的读卡器宏的含义,因此很少使用它们,为了避免混淆,Rich Hickey决定取消在Clojure中使用用户定义的读卡器宏的功能。然而,Clojure有预定义的读卡器宏——quote、vector、regex、map等。简而言之,读卡器宏使您能够在某些限定的上下文中重新定义编程语言的语法

例如,您可以在给定读卡器宏的情况下自己实现正则表达式文本(例如,
#“pattern”
)。如果没有它们,您将被迫正确地转义传递给
re pattern
的字符串文本中的正则表达式

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

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

读者不负责编程语言Lisp的语法,只负责s表达式

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

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

另一个用途是允许用户对s表达式有额外的控制,读者实际上是在阅读。例如,条件要素表达式

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