如何在Slime+SBCL中移除结构体的错误特化defmethod?
如何在Slime+SBCL中移除错误的方法特化
别担心,这个问题在Slime+SBCL里完全能解决,我给你两种实用的操作方式:
方式一:用Slime交互界面可视化操作
- 按下
M-x(也就是Alt+x),输入slime-describe-function并回车,接着输入monster-show。 - 此时会弹出一个描述窗口,里面会列出
monster-show这个泛型函数的所有方法——你能一眼看到那个错误的、针对orc类的特化方法(格式大概是#<STANDARD-METHOD MONSTER-SHOW (ORC)>)。 - 把光标移到这个方法对象的文本上按下回车,打开该方法的详细信息页面。
- 接下来直接移除它:按下
M-x输入slime-remove-method执行,或者在REPL里敲入(remove-method #'monster-show 刚才的方法对象)——比如方法对象是#<STANDARD-METHOD MONSTER-SHOW (ORC) {12345678}>,就把这个完整对象填进去。
方式二:在REPL里用代码定位并删除
如果更习惯用代码操作,直接在Slime的REPL里按步骤执行:
- 先获取
monster-show的所有方法:
这会返回一个方法对象列表,包含你给(generic-function-methods #'monster-show)monster定义的通用方法,以及给orc错误定义的特化方法。 - 精准筛选出针对
orc的错误方法:(defvar *bad-method* (find 'orc (generic-function-methods #'monster-show) :key (lambda (method) (first (method-specializers method))))) - 最后移除这个错误方法:
(remove-method #'monster-show *bad-method*)
执行完后再调用(monster-show (make-instance 'orc)),就会回到原本的通用方法逻辑了。
内容的提问来源于stack exchange,提问作者Collin Bell
相关产品推荐
相关产品推荐

