公共Lisp中标准对象和标准类的层次结构

公共Lisp中标准对象和标准类的层次结构,lisp,common-lisp,clos,Lisp,Common Lisp,Clos,我正在学习CommonLisp(使用Lispworks),现在我正试图进入课堂系统。有一个名为标准对象的类,它被定义为 类标准对象是标准类的一个实例,并且是每个类的一个超类,该类是标准类的一个实例,但自身除外 (摘自) 因此,它是标准类的一个实例 另一方面,标准类是标准对象的子类 >(subtypep 'standard-class 'standard-object) =>T, T 标准对象如何既是标准类的超类又是其实例?如果我们将标准类定义为一个子类型,我们应该在定义它的超类型(

我正在学习CommonLisp(使用Lispworks),现在我正试图进入课堂系统。有一个名为标准对象的类,它被定义为

标准对象标准类的一个实例,并且是每个类的一个超类,该类是标准类的一个实例,但自身除外

(摘自) 因此,它是标准类的一个实例

另一方面,标准类是标准对象的子类

>(subtypep 'standard-class 'standard-object)
=>T, T

标准对象如何既是标准类的超类又是其实例?如果我们将标准类定义为一个子类型,我们应该在定义它的超类型(例如标准对象)之后再定义它,那么超类怎么会成为实例呢?或者我的逻辑是错误的?

要理解这一点,您需要理解
元类的概念。一个元类的实例是一个类,一个类的实例是一个对象,所以基本上我们有三级层次结构

标准类
是一个元类<代码>标准对象
是元类
标准类
的实例,因此它是类。默认情况下,其他每个用户定义的类都继承自标准对象

因此,当您创建一个类时,基本上是实例化
标准类
元类,这个新类由
标准对象
类继承。

CLOS是一个对象系统,其中CLOS概念本身就是一级对象。类本身就是一个元类的实例。其中涉及到一些循环

有一个实例
标准对象
。它是
标准类
的一个实例。它本身就是一个类。所有标准CLOS对象都将其作为超类。还有其他类型的对象,例如结构。因此,
标准对象
是所有典型CLOS对象的超类

CL-USER 25 > (find-class 'standard-class)
#<STANDARD-CLASS STANDARD-CLASS 40F016A063>
标准类
本身就是一个实例。它是所有类对象的类。由于
标准对象
也是一个类,因此类
标准对象
的实例是类
标准类
的实例。由于所有标准类也是CLOS对象,
标准类
继承自
标准对象

CL-USER 22 > (class-of (find-class 'standard-object))
#<STANDARD-CLASS STANDARD-CLASS 40F016A063>
标准类
类对象的类是
标准类

CL-USER 23 > (class-of (find-class 'standard-class))
#<STANDARD-CLASS STANDARD-CLASS 40F016A063>
CL-USER 24 > (find-class 'standard-object)
#<STANDARD-CLASS STANDARD-OBJECT 40F017732B>

标准类
本身就是一个对象和一个类。它是所有CLOS类的超类。

我将尝试只回答一个似乎让您困惑的问题:

标准对象如何成为标准类的超类并成为其子类 实例同时出现

我希望你熟悉数学中的关系概念。使用操作在集合上定义的关系。关系的例子包括“可被整除”、“是一个”、“等于”等。所以,“是一个关系”的实例,“也是一个关系”的子类。他们一点也不一样!子类必须是类,实例可能是类,但通常是其他的。如果你从《自然》中拿一个例子:灵长类是哺乳动物的一个亚类——这就是“是一个亚类”的关系。Lassie(电影中的一只狗)是一种哺乳动物——这是“是实例”关系的一个例子

现在,可能让你困惑的是,某个东西的功能,它是另一个东西的“实例”,是某个东西的类。事实上,这在自然界中并不常见,但我可以想到:


语言和语法。语法是一组规则,它定义了一种语言,语法本身也是一种语言(即它“是”语言的一个子类),而一种语言实例化了语法规则,所以一种语言“是”语法的一个实例。

好的,我想我理解了什么是元类,但是我们是否同时定义
标准对象
标准类
?在我看来,一切都是这样发生的:0)我们定义类
T
;1) 我们定义类
标准对象
,它是
T
的一个子类型;没有
标准类
!2) 我们将
标准类
定义为
标准对象
的子类型,并将其设为元类3)
标准对象
成为
标准类
的实例,对吗?我觉得有点奇怪。标准类不是标准对象的子类型。标准对象是标准类的一个实例,那么为什么
(子页面“标准类”标准对象)
给出了答案
true
?谢谢!有了这些例子,我现在似乎明白了。306在元对象协议艺术的附录D中,展示了引导类CLOS语言的代码;包括所有的圆度是如何去角的;我发现它信息丰富,虽然我还不能说我完全理解它。那个语法示例确实很棒,非常感谢,我现在明白了!我觉得在定义中有一些错误,比如循环,但现在似乎没问题了。