Emacs/Elisp中的多态回调

Ray*_*Ray 8 emacs polymorphism elisp overloading

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

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

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

phi*_*ils 5

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

  1. 正如您所提到的,缓冲区局部变量.

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

    make-variable-buffer-local 如果您希望变量始终是缓冲区本地的,那么肯定是正确的方法.

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

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

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

在所有情况下,您可能会使用funcallapply运行所选功能.

数字1和2也与问题的第二部分相关.