2009-11-10 3 views
3

Как я могу исправить простой макрос foo в (elisp)Eval During Expansion?eval во время расширения макросов emacs lisp

Ни одна из работ следующие:

(defmacro foo1 (a) 
    `(setq (eval ,a) t)) 

(defmacro foo2 (a) 
    `(setq ,(eval a) t)) 

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

Я действительно не понимаю, что не сказал в (elisp)Eval During Expansion. Я думаю, если бы у меня это получилось, я бы смог исправить макрос.

обновление: решение huaiyuan работает:

(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, а т))

хотя это не сделать то же самое, как любой из Foo1, foo2 или foo3. В чем проблема, которую вы пытаетесь решить?

+0

Ваш foo4 выглядит так же, как foo3. – Yoo

+0

Так оно и есть! Я даже искал это! – Vatine

Смежные вопросы