1
19
s表达式是lisp的lisp数据语法。使用函数read读取s表达式,而read宏是lisp扩展读卡器的内置方式。这意味着read宏最直接的用途是实现预定义的数据语法,并打开改变或扩展lisp读取s表达式方式的可能性。 lisp为许多数据类型提供了预定义的外部语法:符号、数字、字符串、数组、字符、conse、列表、结构等等。它允许打印和读取数据对象。
|
2
7
读卡器宏用于可能需要的文本对象语法。它们唯一的问题是可能的语法的平面名称空间(但是,有办法解决这个问题)。 读卡器宏的用法并不多。我想到的一些例子是:
|
3
4
实际上,我倾向于在普通的lisp代码中避免使用它们;最近,我甚至发现自己拒绝使用第三方库,因为它使用了reader宏。这主要是因为,与符号不同,读取器宏只有一个“名称空间”。在选择合适的调度字符时,我似乎常常不同意图书馆作者的观点。 但是,我使用了定制的非标准读表+ 阅读 成功执行简单的分析任务。到目前为止,我使用自定义 可读取的 是一个html模板引擎(另一个,抱歉),语法类似于jsp/asp,但使用的是common lisp作为实际的模板语言,因此您可以
(这并不是仅仅通过readtable黑客完成的,尽管,代码必须经过预处理阶段)。 |
4
2
虽然我使用了很多宏,但除了一些偶然的实验之外,我从未发现需要使用read宏。如果有帮助,在“Let over Lambda”中,您会找到关于它们的广泛讨论: http://letoverlambda.com/index.cl/toc |
5
2
我在github上有两个小项目,展示了在通用lisp中使用读卡器宏的方式和原因。这些是 SHELLSHOCK 和 BOXEN . 如其他答案所述, CL-INTERPOL 是一个站得住脚的有用的例子。 这些是不是 好的 读卡器宏的使用显然是主观的,但我肯定认为它们很有用,否则我就不会编写代码! |
6
1
一个特别常见和有用的替代语法,您可以嵌入读宏是正则表达式语法。实现它一点也不难,因为它只是读取一个具有不同转义规则的字符串,但是如果您经常使用regex,它确实会有回报。这个 CL-INTERPOL dmitry vk提到的库提供了此功能,以及 许多 其他特征。 |
7
0
见 Vsevolod Dyomkin's answer 我的问题是 Writing Common Lisp code that executes from the command line, but not inside the interpreter , 这是reader宏的一个应用程序。 |