Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs elisp:defmacro与lambda_Emacs_Elisp - Fatal编程技术网

Emacs elisp:defmacro与lambda

Emacs elisp:defmacro与lambda,emacs,elisp,Emacs,Elisp,抱歉,我尝试了几次,但我无法构建简单的defmacro-有人能帮我做到这一点吗: 因此,我想定义宏,它将扩展为: (define-key keymap "*" (lambda () (interactive) (some-func "*"))) 我试过这样的方法: (defmacro wrap-and-define-key (keymap key func) `(define-key ,

抱歉,我尝试了几次,但我无法构建简单的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)

如何更改defmacro语句以使最后一个窗体工作?谢谢

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

(defmacro wrap-and-define-key (keymap key func)
  `(define-key ,keymap ,key '(lambda () (interactive) (eval (list ,func ,key)))))

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

(defmacro wrap-and-define-key (keymap key func)
  `(define-key ,keymap ,key '(lambda () (interactive) (eval (list ,func ,key)))))

这不需要宏

(defun wrap-and-define-key (keymap key func)
  (define-key keymap key (lambda () (interactive) (funcall func key))))
不要引用lambda表格。避免评估


不确定您为什么要这样做,但无论如何,这应该满足您的要求。

您不需要宏

(defun wrap-and-define-key (keymap key func)
  (define-key keymap key (lambda () (interactive) (funcall func key))))
不要引用lambda表格。避免评估


不确定为什么要这样做,但无论如何,这应该满足您的要求。

对于第二个示例,宏不起作用的原因是'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))))

对于第二个示例,宏不起作用的原因是“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))))

为什么它需要是一个宏?只要定义一个普通函数。@barmar yea,这似乎是一个更简单、更有用的解决方案。顺便说一句,我只是想了解一下defmacro。谢谢为什么它需要是一个宏?只要定义一个普通函数。@barmar yea,这似乎是一个更简单、更有用的解决方案。顺便说一句,我只是想了解一下defmacro。谢谢虽然我同意,但我认为必须指出,您的代码只能在词汇绑定模式下工作。例如,您需要-*-词法绑定:t-*-位于保存此代码的文件的第一行的某个位置。虽然我同意,但我认为必须指出,您的代码只能在词法绑定模式下工作。也就是说,您需要-*-词法绑定:t-*-位于保存此代码的文件的第一行的某个位置。