为什么在修改它时需要重新编译使用Common Lisp宏的定义?

Pau*_*omé 8 lisp macros common-lisp

这是一个让我很好奇的疑问.

为什么在修改它时还需要重新编译使用Common Lisp宏的定义(显然,重新编译修改后的Common Lisp宏)?

提前致谢.

Vat*_*ine 11

Common Lisp宏是代码替换,它们发生在"宏扩展时".对于解释代码,这可能是"运行时".对于已编译的代码,它几乎总是在"编译时".

代码替换后,在生成的编译代码中没有对宏的引用(如果宏用法已保存到文件中,则磁盘上的原始源仍然具有此功能).

虽然在lisp系统中会有一些方便,它保存了所有"预宏扩展"功能体,并跟踪在哪里使用了宏并自动重新编译使用给定宏的任何内容(可能递归),超出标准.

通常,我在开发的早期编写我的实用程序宏,所以对我来说没有太多需要具备这个功能,而且没有它我会比它更快乐(它会减少运行的图像大小)一点,不需要跟踪所有这些).


650*_*502 9

请注意,可能有必要.

原因是编译实现中的宏仅在编译时扩展一次,并且宏本身不存在于生成的代码中.

要更清楚地考虑一下

(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除非你也重新编译它,否则它将不起作用.