2011-09-08 24 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!")) 

(当我重新格式化它)。

这消除了需要知道你在的功能,这将需要讨厌赘言反正名的问题(我不知道它是否是可能的)。

还有一两件事,我可能会建议只是有一个标志变量设置成零开始你的代码测试,以决定是否要运行的。然后,你不必浪费时间添加和删除的钩所有的时间:结果可能会更容易定制和理解其他人使用你的代码。