elisp mapcar + lambda + defmacro帮助

时间:2011-02-13 05:11:05

标签: emacs macros lisp 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))))

发生器:

(mapcar (lambda (a) (make-my-emacs-command-region a buffer))
        '(foo bar))

但我明白了:

my-emacs-command-a-buffer

我做错了什么?如何强制传递a的值?

2 个答案:

答案 0 :(得分:7)

lisp宏的一个重点是参数 评估。阅读macro pages in the manual,特别是expansion of macrosmacroexpand函数可用于调试问题。此外,backquote可能会帮助您更简洁地编写宏的主体。

答案 1 :(得分:4)

我的elisp有点生疏,但在有人提出实际解释之前:我可以按照预期更多地使用cmd替换(eval cmd)(可能与{相同} {1}})在宏定义体中。

希望这有帮助。