Common lisp 在公共Lisp中取消定义类及其所有方法

Common lisp 在公共Lisp中取消定义类及其所有方法,common-lisp,clos,ccl,Common Lisp,Clos,Ccl,我想取消定义一个类及其所有方法,但在对Googlore进行了相当彻底的搜索之后,我一直无法找到关于如何执行此操作的线索 我正在使用一个名为CCL Clozure CL的Commmon Lisp实现。只需使用: 但是,这不会破坏类对象,也不会删除相应的方法 整个过程需要重新命名myclass符号和类的插槽名称,但是您可能在其他地方使用这些符号,所以请小心 您还必须从为其定义的泛型函数中删除它们 总之,这是一个巨大的企业,当然不值得付出努力 只需重新启动Lisp会话。这是一个相当有趣的问题。尽管如前

我想取消定义一个类及其所有方法,但在对Googlore进行了相当彻底的搜索之后,我一直无法找到关于如何执行此操作的线索

我正在使用一个名为CCL Clozure CL的Commmon Lisp实现。

只需使用:

但是,这不会破坏类对象,也不会删除相应的方法

整个过程需要重新命名myclass符号和类的插槽名称,但是您可能在其他地方使用这些符号,所以请小心

您还必须从为其定义的泛型函数中删除它们

总之,这是一个巨大的企业,当然不值得付出努力


只需重新启动Lisp会话。

这是一个相当有趣的问题。尽管如前所述,您可以使用setf find class'classname nil使make instance'类名停止工作,但实际上并不会删除该类。例如,您可以将find class…的早期结果保存到其他地方:

CL-USER>defclass foo CL-USER>DEFMETHORY show x foo 打印x是一个foo 样式警告:隐式创建新的泛型函数SHOW。 CL-USER>defparameter*foo类*查找类“foo” *富级* CL-USER>显示生成实例“foo” x是一个foo x是一个foo CL-USER>setf查找类“foo nil” 无 CL-USER>生成实例“foo”
; 这是不可移植的,但在像LispWorks这样的IDE中:

使用类浏览器,列出该类的所有方法(不包含继承的方法),从“方法”菜单“调用取消定义”中选择方法

在编辑器中,选择defclass表单,在定义菜单中调用undefine


CCL IDE可能没有这些命令,但SLIME+Emacs可能也有类似的命令。

几周前,我发现自己删除了正在处理的包并重新加载lisp文件,以获得与预期效果相同的效果,尽管我同意这有点过火,因为您丢失了该包下定义的所有内容

假设您的类定义在一个单独的包中,并且可能是该包的一个单独文件,只需切换到cl包,然后删除您的包,重新加载,再次切换回您的包。我的sbcl提示符中的一个示例:

TESTPACKAGE> (in-package :cl)
CL> (delete-package :testpackage)
CL> (load "testpackage.lisp")
CL> (in-package :testpackage)
TESTPACKAGE> 

我只是偶然发现:

HyperSpec中的标准泛型函数。 特别注意在重新定义 标准级

同时查看“fmakunbound”、“unturn”、“delete package”和


最后一段代码接近的位置。

这不一定取消定义类。例如,find类“myclass”的值可能已保存在其他位置,并且它也不会删除任何在“myclass”上专用的方法。有趣的是,在执行defclass foo defvar*foo*find class“foo,然后以这种方式取消定义该类之后,请确保instance*foo*仍然返回一个沿行的对象。我不确定我是否理解。当然,您可能可以专门处理clos::deleted类对象。我只是指出,我认为有些事情是setf find class'foo nil这种天真的方法无法处理的,例如,将类保存到其他地方,但这种方法无法处理。你仍然可以使instance*foo*无误,但它仍然在做一些更有用的事情,因为专门用于foo的方法make instance*foo*将发出错误信号,因为make instance*foo*不再是一个foo。您最终找到了解决方案吗?虽然看起来没有一个标准的解决方法,也许雷纳·乔斯维格斯的回答为你指明了一个特定于CCL的解决方案?或者是别的什么东西完全起作用了?
TESTPACKAGE> (in-package :cl)
CL> (delete-package :testpackage)
CL> (load "testpackage.lisp")
CL> (in-package :testpackage)
TESTPACKAGE> 
(remove-method
  (find-method #'<generic-function-symbol>
               '(:before :after :<some-other-qualifier-you-may-be-interested-in>)
               ;; specializers are the classes or eq specializers
               ;; in method lambda lists
               '(<first-specializer> <second-specializer-and-so-on>)))