|
|
1
5
在宏观扩张时期,
实际上,这两个递归分支同时发生。所以爆炸速度比例子还要快。 更好的主意?
编辑: 下面是一个更正确(但更长)的例子:
|
|
2
4
忽略递归宏。它们是一种痛苦,而且只适用于高级Lisp用户。 简单的非递归版本:
这里有一个递归宏:
|
|
|
3
3
问题是宏的扩展形式是无限的。系统将在宏扩展阶段尝试全部扩展,因此必须耗尽内存。 请注意,表单列表末尾的测试从不进行计算,而是用代码表示。它应该在反勾号表达式之外。另一个人解释说,也需要在宏扩展时对(cdr表单)进行评估,而不是将其作为要编译的代码。 也就是说,类似这样的东西(未经测试):
|
|
|
4
2
我相信你对宏是什么有两种错误的印象。 宏是为扩展而编写的,函数是为执行而编写的。如果编写递归宏,它将递归地展开,而不执行它生成的任何代码。宏是 一点也不 有点像内联函数!
编写宏时,它可以展开为函数调用。当你写宏的时候
不
进入功能不可用的“宏观领域”。写作毫无意义
|
|
|
5
1
这是一个很好的宏递归应用程序:
测验:
宏必须对输入进行推理 句法 并生成进行计数的代码;不能在生成代码和计算之间混淆。 当你这样做的时候,你马上就会出错:
您正在推动元语法计算(语法中有多少种形式?)在运行时对生成的代码模板进行计算。在这个基本情况下,你有正确的片段,但它们是错误的。在我的解决方案中,我有
基本上:
如果不知道该怎么做,请写出希望宏编写的代码。例如:
好吧,对于这个确切的例子,我们会写:
完成!现在假设我们想要支持
当有表格时,
最后,扩展到n元形式:
但是!现在我们注意到带下划线的术语对应于单个案例的输出。
它概括了
与代码生成模板直接对应的
|
|
|
6
0
正如其他人所说,避免递归宏。如果你愿意在函数中这样做,你可以使用
|
|
|
Stephen · 在emacs中评估Lisp的正确方法是什么 1 年前 |
|
|
lightning_missile · 词法范围和共享对象 8 年前 |
|
|
Alexandru Popa · SBCL中奇怪的宏扩展错误 8 年前 |
|
|
Jacky · 编辑列表中的每个偶数索引元素 8 年前 |
|
|
HappyFace · lisp典型缩进约定背后的规则是什么? 8 年前 |