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

时间:2012-10-10 08:29:04

标签: lisp common-lisp clos

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

  

标准对象标准类的一个实例,是每个类的超类,是标准类除了自己。

(摘自http://www.lispworks.com/documentation/HyperSpec/Body/t_std_ob.htm#standard-object) 所以它是标准类

的一个实例

另一方面,标准类标准对象

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

标准对象如何成为标准类的超类并同时成为它的实例?如果我们将standard-class定义为子类型,我们应该在对其超类型(例如标准对象)进行定义之后定义它,那么如何才能使超类成为实例呢?或者我的逻辑是错的?

3 个答案:

答案 0 :(得分:13)

enter image description here

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

有一个实例standard-object。这是standard-class的一个实例。这本身就是一个阶级。所有标准CLOS对象都将它作为超类。还有其他类型的对象,例如结构。所以standard-object作为所有典型CLOS对象的超类。

standard-class就是自己的例子。它是所有类对象的类。由于standard-object也是一个类,因此类standard-object的实例是类standard-class的实例。由于所有标准类都是CLOS对象,standard-class继承自standard-object

CL-USER 22 > (class-of (find-class 'standard-object))
#<STANDARD-CLASS STANDARD-CLASS 40F016A063>

standard-object类对象的类是standard-class

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

standard-class类对象的类是standard-class

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

standard-object本身就是一个对象和一个类。它是所有CLOS对象的超类。

CL-USER 25 > (find-class 'standard-class)
#<STANDARD-CLASS STANDARD-CLASS 40F016A063>

standard-class本身就是一个对象和一个类。它是所有CLOS类的超类。

答案 1 :(得分:2)

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

standard-class是一个元类。 standard-object是元类standard-class的一个实例,因此它是类。默认情况下,每个其他用户定义的类都继承自standard-object类。

因此,当您创建一个类时,您基本上是实例化standard-class元类,而这个新类是由standard-object类继承的。

答案 2 :(得分:1)

我会尽力回答一个似乎让你感到困惑的问题:

  

标准对象如何成为标准类的超类,并且是它的标准类   实例同时?

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

现在,令你感到困惑的是,某事物的功能,即“其他事物的一个实例”就是那个类的东西。这确实不会发生太多,但这是我能想到的:

语言和语法。语法是一组规则,它定义一种语言,语法本身也是一种语言(即“它是”语言的子类),而语言实例化语法规则,因此语言“是语法的实例。” / p>