我想允许用户在"自定义"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)