对不起,我试过几次了,但我无法构建简单的defmacro --有人能帮我吗?
因此,我想要定义宏,它将扩展到:
(define-key keymap "*" (lambda ()
(interactive)
(some-func "*")))我试过这样的方法:
(defmacro wrap-and-define-key (keymap key func)
`(define-key ,keymap ,key (lambda () (interactive) (,func ,key))))它与以下方面一起工作:
(wrap-and-define-key keymap key func)但不适用于
(wrap-and-define-key keymap key 'func)如何更改Def宏语句以使最后一种形式有效?谢谢!
发布于 2015-04-30 02:07:26
你不需要宏。
(defun wrap-and-define-key (keymap key func)
(define-key keymap key (lambda () (interactive) (funcall func key))))(不要引用lambda表格。避免使用eval。)
不知道你为什么要这样,但无论如何,这应该能满足你的要求。
发布于 2015-04-30 19:18:27
第二个例子中宏不能工作的原因是'func作为引号作为参数传递,因为宏的参数不是自动计算的。因此宏中的lambda展开为:
(lambda () (interactive) ('func key))但是,在以这种方式调用函数名时,不能引用它。只有lambda或未引用的符号才能显示为函数调用表达式中的第一项。如果将宏更改为:
(defmacro wrap-and-define-key (keymap key func)
`(define-key ,keymap ,key (lambda () (interactive) (funcall ,func ,key))))看起来不错。当调用lambda时,'func将被计算到普通func符号并传递给funcall。funcall然后在函数命名空间中查找符号(Elisp是Lisp-2)并调用它。
正如另一个答案所建议的那样,您可以通过一个函数来完成这一任务。无论是否启用了词法模式,此函数都将工作:
(defun wrap-and-define-key (keymap key func)
(define-key keymap key `(lambda () (interactive) (funcall ',func ,key))))发布于 2015-04-30 00:14:54
好的,找到一些有用的东西,但不确定--这是一个优雅的解决方案:
(defmacro wrap-and-define-key (keymap key func)
`(define-key ,keymap ,key '(lambda () (interactive) (eval (list ,func ,key)))))https://stackoverflow.com/questions/29956644
复制相似问题