在elisp中,如何将函数放入变量中?
问题描述:
我想允许用户在“自定义” emacs的后端选择自己的命令(通常能够存储在一个变量可执行形式的名称),但是,这并不工作:在elisp中,如何将函数放入变量中?
(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,符号有一个值单元和功能细胞,这是不同的。当你评估一个符号时,你会得到它的值。当您评估以该符号开头的列表时,请致电函数。这就是为什么你可以有一个变量和一个具有相同名称的函数。
大多数种类的分配将设定值(例如let
,setq
,defvar
,defcustom
等)的 - 作为ryuslash显示您可以指定一个函数作为一个值,并通过funcall
称之为 - 但有同样的方式分配给直接使用fset
(或flet
,defalias
等),一个符号的功能细胞
(fset 'my-function 'dumb-f)
(my-function)
在你的情况我会使用ryuslash的答案(除非你需要使用defcustom
而非defvar
如果你想让它可通过获取)。
此外,关于“我很难用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"
你正在卷。很好的答案。 – 2012-03-30 15:27:02
我的例子被严重choosen,抱歉:我想用定制,比如让用户选择自己的电子邮件程序,像这样: '(defcustom我的信箱节目“角马” “邮件客户端命令 例:wl“ :type'string :group'mail-bugger)' 我无法执行(my-mail-program)..? – yPhil 2012-04-01 22:04:44
所以你应该使用':type'函数'而不是''string',默认值为''gnus'而不是''gnus'',然后你可以使用'(funcall my-mail-program) 。确保你了解字符串和符号之间的区别。 – phils 2012-04-02 02:06:07