Pau*_*omé 8 lisp macros common-lisp
这是一个让我很好奇的疑问.
为什么在修改它时还需要重新编译使用Common Lisp宏的定义(显然,重新编译修改后的Common Lisp宏)?
提前致谢.
Vat*_*ine 11
Common Lisp宏是代码替换,它们发生在"宏扩展时".对于解释代码,这可能是"运行时".对于已编译的代码,它几乎总是在"编译时".
代码替换后,在生成的编译代码中没有对宏的引用(如果宏用法已保存到文件中,则磁盘上的原始源仍然具有此功能).
虽然在lisp系统中会有一些方便,它保存了所有"预宏扩展"功能体,并跟踪在哪里使用了宏并自动重新编译使用给定宏的任何内容(可能递归),超出标准.
通常,我在开发的早期编写我的实用程序宏,所以对我来说没有太多需要具备这个功能,而且没有它我会比它更快乐(它会减少运行的图像大小)一点,不需要跟踪所有这些).
请注意,可能有必要.
原因是编译实现中的宏仅在编译时扩展一次,并且宏本身不存在于生成的代码中.
要更清楚地考虑一下
(defmacro badsquare (x)
`(* ,x ,x))
(defun f (x)
(badsquare (+ x 3))
Run Code Online (Sandbox Code Playgroud)
当编译器分析f代码时会将其扩展为
(defun f (x)
(* (+ x 3) (+ x 3)))
Run Code Online (Sandbox Code Playgroud)
并且对badsquare宏的引用不一定存在,所以如果你将badsquare宏重新定义为其他东西,f除非你也重新编译它,否则它将不起作用.
| 归档时间: |
|
| 查看次数: |
214 次 |
| 最近记录: |