在 SBCL Common Lisp 实现中宏扩展何时以及多久发生一次?

When and how often do macro expansions happen in SBCL Common Lisp implementation?

一些 Lisp 实现 (i) 扩展宏一次保存结果 重用; (ii) others reexpand 每次宏调用时的宏。一些 实现 (iii) 甚至 尝试 扩展 函数体 中的宏调用 在 时间 函数被 DEFUNed。

SBCL 属于哪种情况?

谢谢。

在 REPL 中:

* (defparameter *expansions* 0)    
*EXPANSIONS*
* (defmacro foo ()
    (incf *expansions*)
    (print (list :expansions *expansions*))
    nil)
* (foo)

(:EXPANSIONS 1) 
NIL
* (defun bar () (foo))

(:EXPANSIONS 2) 
BAR
* (bar)
NIL
* 

因此函数定义有一个扩展,none 在该函数运行时。

然后可以尝试文件编译器、解释器、不同的调试选项等来检查实现完成的宏扩展的数量。