gpt4 book ai didi

common-lisp - 在 Common Lisp 中取消定义一个类及其所有方法

转载 作者:行者123 更新时间:2023-12-04 22:47:20 24 4
gpt4 key购买 nike

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

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

最佳答案

这是一个比较有趣的问题。虽然,如 sds's answer指出,您可以使用 (setf (find-class 'class-name) nil)制作类似 (make-instance 'class-name) 的东西停止工作,这实际上并没有删除类(class)。例如,您可以保存 (find-class …) 的较早结果。别的地方:

CL-USER> (defclass foo () ())
#<STANDARD-CLASS FOO>
CL-USER> (defmethod show ((x foo))
(print "x is a foo"))
STYLE-WARNING: Implicitly creating new generic function SHOW.
#<STANDARD-METHOD SHOW (FOO) {1002BFD321}>
CL-USER> (defparameter *foo-class* (find-class 'foo))
*FOO-CLASS*
CL-USER> (show (make-instance 'foo))

"x is a foo"
"x is a foo"
CL-USER> (setf (find-class 'foo) nil)
NIL
CL-USER> (make-instance 'foo)
; Evaluation aborted on #<SIMPLE-ERROR "There is no class named ~ .. {1002FDBC61}>.
CL-USER> (make-instance *foo-class*)
#<#<STANDARD-CLASS FOO> {1003217F91}>

我不确定是否真的有任何方法可以从系统中删除一个类,也不清楚这样做意味着什么,因为它必须解决如何处理类的任何现有实例的问题.
(setf find-class)也不会删除任何专用于该类的方法。继续刚刚开始的例子,因为我们仍然可以调用 show在类的实例上,我们仍然可以检索专门的方法:

CL-USER> (show (make-instance *foo-class*))

"x is a foo"
"x is a foo"
CL-USER> (find-method #'show '() (list *foo-class*))
#<STANDARD-METHOD SHOW ((CLASS #<STANDARD-CLASS FOO>)) {1003A7D081}>

但是,您可以使用 REMOVE-METHOD 从泛型函数中删除适用的方法。 :

CL-USER> (remove-method #'show (find-method #'show '() (list *foo-class*)))
#<STANDARD-GENERIC-FUNCTION SHOW (0)>
CL-USER> (show (make-instance *foo-class*))
; Evaluation aborted on #<SIMPLE-ERROR "~@<There is no applicable method for the generic function ~2I~_~S~ .. {1002EA5731}>.

在 Common Lisp 对象系统 (CLOS) 中,方法不属于类,因此谈论“[取消定义] 类及其所有方法”是没有意义的。相反,CLOS 具有泛型函数,程序员定义了专门化泛型函数的方法。正如上面的例子所示,虽然可能没有一种可移植的方式来取消定义一个类,但您可以删除专用于该类实例的方法,但您必须追踪它们是什么。有关更多信息,请查看:
  • Chapter 7. Objects了解 HyperSpec 并熟悉其中的一些概念,因为它们确实与您在许多称为面向对象的语言中找到的不同。您可能会在
  • 中找到更温和的介绍。
  • Chapter 16. Object Reorientation: Generic FunctionsChapter 17. Object Reorientation: Classes来自 Peter Seibel 的 Practical Common Lisp .这本书是一个很好的引用,整个内容都可以在线免费获得。

  • 这个话题也在 comp.lang.lisp 上讨论​​过:
  • undefining a class
  • 关于common-lisp - 在 Common Lisp 中取消定义一个类及其所有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18619202/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com