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