2012-10-03 170 views
4

我正在開發一個Emacs Lisp包,我想添加的一個特定功能是能夠在運行中定義函數 - 它們將遵循相同的命名約定,但這將幫助我不必手動聲明每一個。Emacs Lisp - 聲明具有變量/變量名稱的函數

舉個例子,我有一個名爲Exec中的基本功能,這需要一個參數是可執行推出名稱:

(def exec (cmd) 
    (async-shell-command cmd "buffer")) 

與此同時,在這種特殊情況下,我知道了我將要使用的可執行文件列表 - 或者更準確地說,我知道如何獲取它們的列表,因爲它可能隨時間而改變。所以我想這樣做,因爲可執行以下列表的內容:

("a" "b" "c") 

是遍歷他們和每一個創建函數的名稱exec- [執行] - EXEC-A,exec- b,exec-c。

不幸的是,defun不會評估NAME參數,所以我不能動態地創建函數名。

PS。 exec命令本身已經足夠好了 - 它使用completing-read以及提供的可執行文件列表,但我認爲上面的內容會很好。

回答

5

怎麼回合

(dolist (name name-list) 
    (defalias (intern (concat "exec-" name)) 
    `(lambda() ,(format "Run %s via `exec'." name) (interactive) (exec ,name)))) 
+0

這是絕對精彩,太感謝你了:d。需要學習更多的Emacs Lisp我認爲:)。 – ppb

+2

你也可以使用宏來生成函數,但是這個defalias/lambda配對非常簡潔! – phils

+0

@Stefan,你在選擇defalias + lambda的時候考慮過了什麼? –