繁体   English   中英

在elisp中,如何将函数放入变量中?

[英]In elisp, how do I put a function in a variable?

我想允许用户在“自定义”emacs后端中选择自己的命令(并且通常能够将可执行的表单名称存储在变量中)但这不起作用:

    (defun dumb-f ()
    (message "I'm a function"))

    (defvar my-function "dumb-f")

    (my-function)
    ==> Debugger entered--Lisp error: (invalid-function "dumb-f")

    (setq my-function 'dumb-f)

    (my-function)
    ==> Debugger entered--Lisp error: (invalid-function "dumb-f")

我尝试了各种各样的形式,但仍然没有运气,而且我很难找到它,我得到了关于函数和变量的结果,但没有关于如何将前者放入后者......?

请注意,在Emacs Lisp中,符号具有值单元格和功能单元格,它们是不同的。 评估符号时,您将获得其 当您评估以该符号开头的列表时,可以调用其函数 这就是为什么你可以有一个变量和一个具有相同名称的函数。

大多数类型的赋值都会设置值(例如letsetqdefvardefcustom等等) - 并且正如ryuslash所示,您可以将函数指定为值并通过funcall调用它 - 但是也有方法可以使用fset (或fletdefalias等)直接分配给符号的函数单元格

(fset 'my-function 'dumb-f)
(my-function)

在你的情况下,我会使用ryuslash的答案(除非你需要使用defcustom而不是defvar如果你想通过customize提供它)。

此外,关于“我很难用Google搜索”; 永远记住,Emacs是自我记录的 ,除了其他东西之外还包含一个完整的索引(好吧,实际上不止一本手册)。 因此,即使Google仍然是您的第一个停靠点,如果您找不到所需内容,也不应该是最后一个。 从elisp手册的内容页面,您可以导航到“功能”,然后导航到“调用功能”,您将立即被告知funcall

要运行存储在变量中的函数,可以使用funcall

(defun dumb-f ()
  (message "I'm a function"))

(defvar my-function 'dumb-f)

(funcall my-function)
==> "I'm a function"

@phils的好回答提到了设置符号函数定义的各种方法,但我还需要一种方法来获取它。

要将符号的值作为函数获取,可以使用函数symbol-function

例如:

; remember the old value of 'foo as a function
(set 'foo-backup (symbol-function 'foo))
; change it, to experiment or whatever
(defun foo () whatever)
; revert it back to what it was
(fset 'foo foo-backup)

事实上,emacs手册在这里很有帮助,特别是:

https://www.gnu.org/software/emacs/manual/html_node/elisp/Symbol-Components.html

https://www.gnu.org/software/emacs/manual/html_node/elisp/Function-Cells.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM