2012-03-30 62 views
15

我想允許用戶在「自定義」 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") 

我試着各種形式,但仍然沒有運氣,我很難找到它,我得到了有關函數和變量的結果,但沒有一個關於如何把前者放在後者中。

回答

24

注意在的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

15

要運行存儲在變量的函數可以使用funcall

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

(defvar my-function 'dumb-f) 

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