一些 Lisp 实现 (i)一次扩展宏并保存结果以供 重用;(ii) 其他人在每次宏调用时重新展开宏。一些实现 (iii) 甚至尝试在函数被 DEFUN时扩展函数体 中的宏调用。
SBCL 是哪一种?
谢谢。
一些 Lisp 实现 (i)一次扩展宏并保存结果以供 重用;(ii) 其他人在每次宏调用时重新展开宏。一些实现 (iii) 甚至尝试在函数被 DEFUN时扩展函数体 中的宏调用。
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
*
因此,函数定义有一个扩展,而在该函数的运行时没有。
然后可以尝试文件编译器、解释器、不同的调试选项等来检查实现完成的宏扩展的数量。