我們來定義一個函數,它的主體包含宏,它將在某個未指定的時間展開,並在此過程中使用全局動態值*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定義不需要執行任何編譯時的副作用
但是還有其他方法可以做到嗎?
宏內部綁定有什麼問題? – sbenitezb 2012-01-04 15:15:47
我已經編制了這個微不足道的例子來解決這個問題。但是,我的用例更復雜一些部分單獨生成,因此,基本上,我不能在宏內部執行此操作。 – 2012-01-04 15:18:32
只需在宏的* test *之前刪除,以便在運行時評估* test *的值,而不是編譯時。雖然這可能會破壞你想要做的事情的目的? – 2012-01-05 16:33:38