如何修复(elisp)Eval During Expansion中的简单宏foo
?
以下都不起作用:
(defmacro foo1 (a)
`(setq (eval ,a) t))
(defmacro foo2 (a)
`(setq ,(eval a) t))
(defmacro foo3 (a)
`(setq ,a t))
我真的不明白(elisp)Eval During Expansion中的内容。我想如果我得到它,我就能修好宏。
更新:怀远的解决方案有效:
(defmacro foo7 (a)
`(set ,a t))
(setq x 'b
a 'c)
(foo7 x)
(assert (eq b t))
(assert (eq x 'b))
(foo7 a)
(assert (eq a 'c))
(assert (eq c t))
(macroexpand '(foo7 x)) ; ==> (set x t)
(macroexpand '(foo7 a)) ; ==> (set a t)
答案 0 :(得分:2)
答案 1 :(得分:0)
你是什么意思,“修复”?
您所引用的页面显示只有在使用与宏参数名称不同的名称调用宏时,该宏才起作用。要解决相关问题,请修改宏以减少冲突机会,或者使用它以使其不冲突。
(defmacro foo (aVeryLongAndImprobablyConflictingName)
(list 'setq (eval aVeryLongAndImprobablyConflictingName) t))
答案 2 :(得分:0)
“正确”修复不需要在宏扩展功能中评估用户提供的参数。
(defmacro foo4(a) `(setq,a t))
虽然这与foo1,foo2或foo3不同。你试图解决的问题是什么?