首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >elisp:用lambda实现

elisp:用lambda实现
EN

Stack Overflow用户
提问于 2015-04-29 23:52:35
回答 3查看 720关注 0票数 1

对不起,我试过几次了,但我无法构建简单的defmacro --有人能帮我吗?

因此,我想要定义宏,它将扩展到:

代码语言:javascript
复制
(define-key keymap "*" (lambda ()
                          (interactive)
                          (some-func "*")))

我试过这样的方法:

代码语言:javascript
复制
(defmacro wrap-and-define-key (keymap key func)
  `(define-key ,keymap ,key (lambda () (interactive) (,func ,key))))

它与以下方面一起工作:

代码语言:javascript
复制
(wrap-and-define-key keymap key func)

但不适用于

代码语言:javascript
复制
(wrap-and-define-key keymap key 'func)

如何更改Def宏语句以使最后一种形式有效?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-30 02:07:26

你不需要宏。

代码语言:javascript
复制
(defun wrap-and-define-key (keymap key func)
  (define-key keymap key (lambda () (interactive) (funcall func key))))

(不要引用lambda表格。避免使用eval。)

不知道你为什么要这样,但无论如何,这应该能满足你的要求。

票数 2
EN

Stack Overflow用户

发布于 2015-04-30 19:18:27

第二个例子中宏不能工作的原因是'func作为引号作为参数传递,因为宏的参数不是自动计算的。因此宏中的lambda展开为:

代码语言:javascript
复制
(lambda () (interactive) ('func key))

但是,在以这种方式调用函数名时,不能引用它。只有lambda或未引用的符号才能显示为函数调用表达式中的第一项。如果将宏更改为:

代码语言:javascript
复制
(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)并调用它。

正如另一个答案所建议的那样,您可以通过一个函数来完成这一任务。无论是否启用了词法模式,此函数都将工作:

代码语言:javascript
复制
(defun wrap-and-define-key (keymap key func)
  (define-key keymap key `(lambda () (interactive) (funcall ',func ,key))))
票数 2
EN

Stack Overflow用户

发布于 2015-04-30 00:14:54

好的,找到一些有用的东西,但不确定--这是一个优雅的解决方案:

代码语言:javascript
复制
(defmacro wrap-and-define-key (keymap key func)
  `(define-key ,keymap ,key '(lambda () (interactive) (eval (list ,func ,key)))))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29956644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档