Emacs / Elisp中的多态回调

时间:2011-11-24 22:10:56

标签: emacs polymorphism elisp overloading

在elisp中实现多态回调的惯用方法是什么?

具体来说,假设我有一个具有执行某个操作的函数的次模式,然后调用另一个函数。根据当前缓冲区是包含C ++文件还是Java文件,第二个函数应具有不同的实现。

或者,假设我想要重载变量而不是函数。例如,我想调用一些外部可执行文件,传递给它的其中一个参数根据当前缓冲区是否有C ++文件或Java文件而有所不同。我希望能够在泛型函数中构造命令行,并根据缓冲区的内容替换一个参数。 make-variable-buffer-local是正确的做法吗?这些局部变量在什么时候(以及通过哪种机制)最初应该被设置?

3 个答案:

答案 0 :(得分:5)

我猜你有各种各样的方法。您的回调函数需要考虑的一些选项是:

  1. 缓冲区局部变量,如您所述。

    如何设置它实际上取决于您的用例,但您可以实现特定的主模式挂钩,或after-change-major-mode-hook用于一般情况。

    如果您希望变量始终是缓冲区本地的,那么

    make-variable-buffer-local肯定是正确的方法。

  2. 将主要模式映射到其相关功能。

    为您需要的所有模式配置此项,然后执行当前主要模式的查找。

  3. 只需根据主要模式名称生成函数名称,如果存在这样的函数则调用它。

  4. 在所有情况下,您都可能会使用funcallapply来运行所选的功能。

    数字1和2也与你问题的第二部分有关。

答案 1 :(得分:1)

如果您正在编辑c ++或java文件,则该缓冲区应分别位于c++-modejava-mode。所以你可以做类似以下的事情:

(defun function1 ()
  (interactive)
  ;; put your generic code here
  (cond ((string= major-mode "c++-mode")
     (function2-cpp))
    ((string= major-mode "java-mode")
     (function2-java))
    (t (message "I don't know what mode this is"))))

(defun function2-cpp ()
  (message "this is cpp mode"))

(defun function2-java ()
  (message "this is java mode"))

答案 2 :(得分:1)

我不知道一种惯用的方式,但我写了这个可能做你想要的东西:

http://lists.gnu.org/archive/html/gnu-emacs-sources/2011-03/msg00001.html