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

yPh*_*hil 16 emacs elisp

我想允许用户在"自定义"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")
Run Code Online (Sandbox Code Playgroud)

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

phi*_*ils 27

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

大多数种类的分配将设定值(例如let,setq,defvar,defcustom,等...) -作为ryuslash显示您可以指定一个函数作为一个值,并通过调用它funcall-但也有方法来赋值给一个符号的功能细胞直接使用fset(或flet,defalias等)

(fset 'my-function 'dumb-f)
(my-function)
Run Code Online (Sandbox Code Playgroud)

在你的情况下,我会使用ryuslash的答案(除了你需要使用defcustom而不是defvar你希望它可以通过customize).

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


ryu*_*ash 16

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

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

(defvar my-function 'dumb-f)

(funcall my-function)
==> "I'm a function"
Run Code Online (Sandbox Code Playgroud)