在 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 在该函数运行时。
然后可以尝试文件编译器、解释器、不同的调试选项等来检查实现完成的宏扩展的数量。
一些 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 在该函数运行时。
然后可以尝试文件编译器、解释器、不同的调试选项等来检查实现完成的宏扩展的数量。