我试图动态找到当前运行的函数(this-function)的名称,即
(defun my-func () (remove-hook 'some-hook this-function) (do-something))
答案 0 :(得分: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!"))
(当我重新格式化它时)。
这消除了需要知道你所在的函数名称的问题,无论如何都需要令人讨厌的宏观(我不确定它是否可能)。
还有一件事,我可能建议最初将一个标志变量设置为nil,您的代码将测试该变量以决定是否运行。然后,您不必一直在添加和删除挂钩:使用您的代码,任何其他人都可以更轻松地自定义和理解结果。