我怎样才能取消合格方法?

时间:2011-05-12 10:12:37

标签: lisp common-lisp slime

在开发过程中,我定义了一个'initialize-instance:after'方法,经过一段时间之后不再需要这个方法,实际上让我不知所措,因为在它内部调用的代码已经无效了。由于unintern函数没有限定符的参数,有没有办法可以“unintern”方法的符号限定符组合,这样我就不必使用slime-restart-inferior-lisp和从一开始就重新加载项目?

3 个答案:

答案 0 :(得分:16)

您可以使用标准函数find-methodremove-method来执行此操作:

(remove-method (find-method #'frob '(:before) '(vehicle t)))

我发现使用粘液检查员要容易得多。如果您的函数名为frob,则可以使用M-x slime-inspect #'frob RET查看frob上所有方法的列表,并选择要删除的各个方法。

答案 1 :(得分:5)

见Xach的答案。

方法收集在通用函数中。 UNINTERN与此毫无关系。你想要的是从泛型函数中删除一个方法。

大多数Common Lisp IDE都有办法做到这一点。通过编辑器(M-x undefine ...)或通过一些检查工具。

答案 2 :(得分:0)

使用AllegroCL 9.0。 Xach的回答对我来说并不完全有用。

我方法的定义:

defmethod my-method* ((expr forall-expr) bindings)

forall-expr是一个类,绑定是未键入的。要找到我必须使用的方法:

(find-method #'my-method* '() (mapcar #'find-class '(forall-expr t)))

然后删除我使用的方法的定义:

(remove-method #'my-method* (find-method #'my-method* '() (mapcar #'find-class '(forall-expr t))))

我能够从http://www.gigamonkeys.com/book/object-reorientation-classes.html的脚注7以及Lisp HyperSpec的示例中找到方法http://clhs.lisp.se/Body/f_find_m.htm