在emacs lisp宏扩展期间的eval

时间:2009-11-10 12:08:50

标签: emacs macros elisp

如何修复(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)

3 个答案:

答案 0 :(得分:2)

尝试

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

elisp的语义通常是实现的偶然。对于经过深思熟虑的明确指定的宏系统示例,我建议Common Lisp's

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

“正确”修复不需要在宏扩展功能中评估用户提供的参数。

(defmacro foo4(a)   `(setq,a t))

虽然这与foo1,foo2或foo3不同。你试图解决的问题是什么?