让我们定义一个函数,其主体包含宏,该宏将在某个未指定的时间展开,并*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 不需要执行任何编译时副作用
但是还有其他方法可以做到这一点吗?