【问题标题】:How to undefine defmethods如何取消定义定义方法
【发布时间】:2019-12-05 19:14:03
【问题描述】:

如何取消定义cl-defmethods 我为cl-defgenerics 定义的,而不需要重新启动emacs?

例如,给定这些

(cl-defgeneric my-fun (n &optional _arg) n)
(cl-defmethod my-fun ((n string)) (upcase n))
(cl-defmethod my-fun ((n integer)) (* n n))
(cl-defmethod my-fun (n &context (major-mode emacs-lisp-mode))
  (if (evenp n) n (cl-call-next-method (/ n 2))))

如何以交互方式删除其中一种方法?例如。删除专用于 elisp 缓冲区的方法,因此从 elisp 缓冲区调用 (my-fun 9) 只会导致 81,而不是先通过当前的major-mode专门的方法?

【问题讨论】:

  • 看起来你不能以任何简单的方式。一个可怕的解决方法是重新定义方法以简单地执行(call-next-method)。
  • @tfb 聪明的黑客,谢谢!

标签: generics lisp elisp


【解决方案1】:

[这源于评论,但我认为在没有更好的情况下它可能算作一个答案。]

我认为使用generic.el 很难做到这一点。然而,做一些功能等效的事情的一个技巧是用一个简单地说(call-next-method)的定义替换你想要“删除”的方法。完成此操作后,该方法在功能上基本上不再存在,只是它会减慢速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多