2011-09-08 32 views
2

我試圖動態查找,即運行你如何找到當前正在運行的功能可按名稱:當前功能,此功能,電流defun定義,這-defun定義

當前函數的名稱(此功能)
 
    (defun my-func() 
     (remove-hook 'some-hook this-function) 
     (do-something)) 
+2

我不認爲這是可能的。但是,如果你描述你想要做的事情,也許我們可以建議另一種方法來做到這一點。 – Lindydancer

+0

我想一旦運行,從鉤去掉的功能。我希望儘可能使函數具有通用性。 – dericbytes

回答

6

我還沒有測試過這個,但爲什麼不寫一個宏來封裝你想要的?可能是像下面這樣的東西?

(defmacro one-shot-hook (name hook &rest body) 
    `(defun ,name() 
    (remove-hook ',hook ',name) 
    ,@body) 

然後,例如

(macroexpand-all-1 
'(one-shot-hook test c-mode-hook 
    (message "Yay!"))) 

(defun test nil 
    (remove-hook (quote c-mode-hook) (quote test)) 
    (message "Yay!")) 

(當我重新格式化它)。

這消除了需要知道你在的功能,這將需要討厭贅言反正名的問題(我不知道它是否是可能的)。

還有一兩件事,我可能會建議只是有一個標誌變量設置成零開始你的代碼測試,以決定是否要運行的。然後,你不必浪費時間添加和刪除的鉤所有的時間:結果可能會更容易定製和理解其他人使用你的代碼。