English 中文(简体)
eval during emacs lisp macro expansion
原标题:

How can I fix the simple macro foo in (elisp)Eval During Expansion?

None of the followings work:

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

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

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

I really don t get what s said in (elisp)Eval During Expansion. I think if I got it, I d have been able to fix the macro.

Update: huaiyuan s solution works:

(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)
最佳回答

Try

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

The semantics of elisp is often accidental to the implementation. For an example of well thought out, clearly specified macro systems, I recommend Common Lisp s.

问题回答

What do you mean, "fix" ?

The page you are referring to shows that the macro works only if you call it with a name that is not the same name as the macro parameter. To fix the issue in question, either modify the macro to reduce the conflict opportunities, or the usages so that it does not conflict.

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

The "right" fix is to not require evaluation of user-supplied parameters within the macro expansion function.

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

Though this does NOT do the same thing as either of foo1, foo2 or foo3. What is the problem you are trying to solve?





相关问题
suppress additional braces in emacs electric mode

I started using ruby-electric-mode. I like it except that I am used to closing open brackets myself (the other pairing are still useful to me). How can I make emacs suppress additional brackets when ...

Setting up an emacs environment in windows?

I am currently constrained to a windows dev box and I want to migrate my projects from eclipse to emacs. What are some good references on setting up an emacs dev environment for windows? Anything ...

Emacs Setting which-function-mode

I would like to have which-function-mode on by default when I open up Emacs. I ve added the following lines to my .emacs file. (setq which-func-mode t) (setq which-function-mode t) When I open ...

Enabling go mode for emacs

I don t seem to be able to enable a go mode for emacs. C mode doesn t work without semicolons. The best I have found is the JavaScript mode by Karl Landstrom, since JavaScript also doesn t require ...

Custom Emacs key bindings are not working

The key bindings I ve defined in my .emacs file aren t working. Here s the file: ;init modes (menu-bar-mode 0) (tool-bar-mode 0) (cua-mode) (column-number-mode) (fset perl-mode cperl-mode) (cperl-...

eval during emacs lisp macro expansion

How can I fix the simple macro foo in (elisp)Eval During Expansion? None of the followings work: (defmacro foo1 (a) `(setq (eval ,a) t)) (defmacro foo2 (a) `(setq ,(eval a) t)) (defmacro foo3 (...

Get local cvs comment history when committing file/s in emacs

I often commit files with similar cvs comment but not in a single operation. I would like to able to bring up previous comments I ve used in a previous commit when I am in the process of writing a ...

热门标签