你如何找到当前运行的函数的名称:current-function,this-function,current-defun,this-defun

时间:2011-09-08 09:19:53

标签: elisp

我试图动态找到当前运行的函数(this-function)的名称,即

  (defun my-func ()
      (remove-hook 'some-hook this-function)
      (do-something))

1 个答案:

答案 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,您的代码将测试该变量以决定是否运行。然后,您不必一直在添加和删除挂钩:使用您的代码,任何其他人都可以更轻松地自定义和理解结果。