2009-11-10 90 views
3

如何修复(elisp)Eval During Expansion中的简单宏fooemacs lisp宏扩展时eval

的以下工作无:

(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) 

回答

2

尝试

 
(defmacro foo7 (a) 
    `(set ,a t)) 

的elisp的语义往往是偶然的实现。对于经过深思熟虑的例子,明确指定的宏观系统,我推荐Common Lisp's

0

你是什么意思, “修复”?

您所指的页面显示该宏只有在您使用与宏参数名称不同的名称进行调用时才起作用。要解决有问题的问题,请修改宏以减少冲突机会,或者避免使用冲突。

(defmacro foo (aVeryLongAndImprobablyConflictingName) 
    (list 'setq (eval aVeryLongAndImprobablyConflictingName) t)) 
0

“正确”的解决方法是不需要评估宏扩展函数中用户提供的参数。

(defmacro foo4(一) `(setq,一T))

虽然这不会做同样的事情,无论是foo1,foo2的或foo3的。你试图解决什么问题?

+0

您的foo4看起来与foo3相同。 – Yoo

+0

所以它!我甚至找到了! – Vatine