在emacs/slime实时环境中自动重新编译

BnM*_*cGn 4 emacs macros common-lisp slime

鉴于这种情况:

(defmacro mac1 ...)

(defun func1 () 
  (mac1 ...))
Run Code Online (Sandbox Code Playgroud)

mac1在实时环境中重新定义在func1其自身重新编译之前不会受到影响.

有没有办法让emacs或lisp在重新编译func1时自动重新mac1编译?

在源代码中这样的东西是可以接受的:

(watch
  (defmacro mac1 ...))

(on-signal (mac1)
  (defun func1 ...))
Run Code Online (Sandbox Code Playgroud)

这并不难实现,但我宁愿避免重新发明.

cor*_*ump 5

宏不一定是编译的.如果您使用的是SBCL(参见手册),则会有一个名为的变量sb-ext:*evaluator-mode*,可以设置为:interpret在评估期间扩展宏.其他实现可能提供类似的东西.这允许您更改宏的定义,而无需像已经使用函数那样重新编译调用站点.

或者,slime定义一个名为的函数slime-who-macroexpands.在Common Lisp环境(swank)或emacs方面,你需要挖掘一下它是如何工作的,也许可以利用它.