2

一些 Lisp 实现 (i)一次扩展宏并保存结果以供 重用;(ii) 其他人在每次宏调用时重新展开宏。一些实现 (iii) 甚至尝试在函数被 DEFUN时扩展函数体 中的宏调用。

SBCL 是哪一种?

谢谢。

4

1 回答 1

3

在 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
* 

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

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

于 2021-08-21T09:26:48.723 回答