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

在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,符号有一个值单元和功能细胞,这是不同的。当你评估一个符号时,你会得到它的。当您评估以该符号开头的列表时,请致电函数。这就是为什么你可以有一个变量和一个具有相同名称的函数。

大多数种类的分配将设定值(例如letsetqdefvardefcustom等)的 - 作为ryuslash显示您可以指定一个函数作为一个值,并通过funcall称之为 - 但有同样的方式分配给直接使用fset(或fletdefalias等),一个符号的功能细胞

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

在你的情况我会使用ryuslash的答案(除非你需要使用defcustom而非defvar如果你想让它可通过获取)。

此外,关于“我很难用Google搜索”;永远记住Emacs是自我记录,除了其他东西包含一个很好的手册完整索引(实际上,一个以上的手册)。因此,即使Google仍然是您的第一通电话端口,如果您找不到您要查找的内容,它也不应该是您的最后一个通话端口。从elisp手册的内容页面,您可以导航到“功能”,然后“调用功能”,几乎可以立即通知您有关funcall

+1

你正在卷。很好的答案。 – 2012-03-30 15:27:02

+0

我的例子被严重choosen,抱歉:我想用定制,比如让用户选择自己的电子邮件程序,像这样: '(defcustom我的信箱节目“角马” “邮件客户端命令 例:wl“ :type'string :group'mail-bugger)' 我无法执行(my-mail-program)..? – yPhil 2012-04-01 22:04:44

+1

所以你应该使用':type'函数'而不是''string',默认值为''gnus'而不是''gnus'',然后你可以使用'(funcall my-mail-program) 。确保你了解字符串和符号之间的区别。 – phils 2012-04-02 02:06:07

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

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

(defvar my-function 'dumb-f) 

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