elisp mapcar + lambda + defmacro帮助

Any*_*orn 5 lisp emacs macros elisp

我正在尝试使用宏生成函数:

(defmacro make-my-emacs-command-region (cmd name)
  (list 'defun (intern (format "my-emacs-command-%s-%s" cmd name))
        '(&optional arg)
        (list 'interactive "p")
        (list (intern (format "mark-%s" name)) 'arg)
        (list (intern (format "my-emacs-command-%s-region" cmd))
              '(region-beginning) '(region-end))))
Run Code Online (Sandbox Code Playgroud)

发电机:

(mapcar (lambda (a) (make-my-emacs-command-region a buffer))
        '(foo bar))
Run Code Online (Sandbox Code Playgroud)

但我得到:

my-emacs-command-a-buffer
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我如何强制传递价值a

Tre*_*son 7

lisp宏的一个重点是评估参数.阅读手册中宏页面,特别是宏扩展.该macroexpand函数将用于调试问题.此外,反引用可能会帮助您更简洁地编写宏的主体.


JB.*_*JB. 4

我的 elisp 有点生疏,但直到有人提出实际的解释:我可以让你的例子比预期的更有效,我在宏定义主体中替换cmd(eval cmd)(可能与 相同)。name

希望这可以帮助。