让我们定义一个函数,其主体包含宏,该宏将在某个未指定的时间展开,并*test*在此过程中使用全局动态值。
> (defvar *test* nil)
> (defmacro body ()
`(print ,*test*))
> (defun test ()
(body))
> (test)
NIL
但是,如果我想绑定*test*到,比如说,1在函数定义期间,以便宏扩展在此绑定有效的情况下运行,并且调用test产生1而不是NIL.
只是包装defun不起作用let:
> (let ((*test* 1))
(defun test ()
(body)))
> (test)
NIL
可能,它与 Hyperspec 中的这一行有关:
defun 不需要执行任何编译时副作用
但是还有其他方法可以做到这一点吗?