10

在开发过程中,我定义了一个“initialize-instance :after”方法,一段时间后不再需要它,实际上妨碍了我的工作,因为它内部调用了不再有效的代码。由于该unintern函数没有限定符的参数,有什么方法可以“取消实习”一个方法的符号限定符组合,这样我就不必重新启动inferior-lisp并再次加载项目开始?

4

3 回答 3

16

您可以使用标准功能find-methodremove-method执行此操作:

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

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

于 2011-05-12T11:02:46.170 回答
5

请参阅 Xach 的答案。

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

大多数常见的 Lisp IDE 都有办法做到这一点。通过编辑器(Mx undefine ...)或通过一些检查器工具。

于 2011-05-12T11:29:21.493 回答
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 /正文/f_find_m.htm

于 2013-04-10T22:52:46.220 回答