2009-11-10 114 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