gpt4 book ai didi

common-lisp - 了解 CLOS :after and primary methods

转载 作者:行者123 更新时间:2023-12-03 07:52:26 25 4
gpt4 key购买 nike

在hunchentoot源代码中,有一个:after def方法,名为initalize-instance .

这个特定示例是整个项目中称为 initalize-instance 的少数 :after 方法之一。

我使用 CLOS 的经验告诉我,:before 需要一个主要方法,可以使用 :after:around 方法。

但是在 hunchentoot 包中,我看不到他们如何创建主要方法来允许 :after 方法工作。

我错过了什么?

最佳答案

符号initalize-instance位于COMMON-LISP包中。它是标准提供的通用功能之一。如果你检查这个通用函数,你会发现它有很多方法。还有一个匹配的主要方法。方法可以在任何地方声明,不需要在特定文件中。

CL-USER 9 > (defclass my-class () (a b))
#<STANDARD-CLASS MY-CLASS 8010021793>

CL-USER 10 > (defmethod initialize-instance :after ((instance my-class)
&rest initargs &key)
(print `(:aftermethod for initialize-instance
of class my-class
and instance ,instance)))
#<STANDARD-METHOD INITIALIZE-INSTANCE (:AFTER) (MY-CLASS) 8010027193>

CL-USER 11 > (make-instance 'my-class)

(:AFTERMETHOD FOR INITIALIZE-INSTANCE OF CLASS
MY-CLASS AND INSTANCE #<MY-CLASS 80103A979B>)
#<MY-CLASS 80103A979B>

initialize-instance 与类 my-class 对象的方法组合如下所示:

MULTIPLE-VALUE-PROG1
CALL-METHOD
(METHOD INITIALIZE-INSTANCE (STANDARD-OBJECT))
CALL-METHOD
(METHOD INITIALIZE-INSTANCE :AFTER (MY-CLASS))

STANDARD-OBJECT 的主要方法是系统提供的。

CL-USER 12 > (typep * 'standard-object)
T

上面显示该实例也是 standard-object 类,因为 standard-objectmy-class 的父类(super class)。

CL-USER 13 > (class-direct-superclasses (find-class 'my-class))
(#<STANDARD-CLASS STANDARD-OBJECT 80D01BCA7B>)

standard-object 类是 my-class 类的父类(super class)。

关于common-lisp - 了解 CLOS :after and primary methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76845416/

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