2
|
Claire Nielsen Dhiraj Sharma · 技术社区 · 6 年前 |
![]() |
1
4
因为您在编译/宏扩展时知道参数,所以不需要应用:
也不需要在列表中重复引用:
这样的代码是非常不寻常的。 运行时生成代码
名字
通过宏构造
在代码中,您将在顶层编写:
|
![]() |
2
1
作为一个函数,你绝对可以做你想要做的事情。这不是最漂亮的代码,但它会起作用。从宏中去掉的关键点是正确的:它们是在编译时进行评估的[1]我查看了您引用的另一个问题,当它们向您提供一些很好的优化/重构建议时,有时您只需要您想要的东西。因此,我试图对您的代码进行最小程度的更改,以使其能够在一次更改中正常工作:而不是使用在编译时进行eval的宏,而是将其作为一个函数,生成代码,然后在运行时进行eval:
现在,您应该能够做任何对函数的大规模定义有意义的事情(例如,包装宏、循环等)。这种方法需要记住的一点是,使用相同模板/字段名的重复调用的性能将很差(因为它盲目地重新生成相同的源代码,并在每次调用时对其进行评估)。与宏相比,它的定义在编译时只计算一次。)但是,由于您似乎对每对参数调用一次并存储生成的结果,这不是问题。 [1]除非您使用此处使用的方法 生成 宏并在运行时对其进行评估。这可能会令人困惑,甚至比宏更难调试,但可以做到。 |
![]() |
lightning_missile · 词法范围和共享对象 6 年前 |
![]() |
Alexandru Popa · SBCL中奇怪的宏扩展错误 6 年前 |
![]() |
Jacky · 编辑列表中的每个偶数索引元素 6 年前 |
![]() |
HappyFace · lisp典型缩进约定背后的规则是什么? 6 年前 |
![]() |
Jorge · 在公共Lisp中初始化计数器变量 6 年前 |
![]() |
Rorschach · cl循环破坏性修改cons单元 7 年前 |