在Common Lisp的标准对象和标准类的层次(Hierarchy of standard-obj

2019-08-01 07:44发布

我学的Common Lisp(与Lispworks),我想进入一流的系统现在。 还有一类所谓的标准对象 ,并将其定义为

标准目的标准级的一个实例,并为每一个类,它是标准类的一个实例,除了本身的类的超类。

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

在另一方面标准级标准对象的子类

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

标准的对象如何能为标准级超类,并在同一时间将它的实例? 如果我们定义标准级的亚型,我们应该其父类型(例如,标准对象)的defenition 定义它,所以它怎么能,超类成为实例? 还是我的逻辑是错误的?

Answer 1:

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类的父类。



Answer 2:

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

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

所以,当你创建一个类时,你基本上实例standard-class元类和新类是由遗传standard-object类。



Answer 3:

我会尽量给一个答案,似乎是混乱的,你只有一个问题:

标准的对象如何能为标准级超类,并在同一时间将它的实例?

我希望你所熟悉的数学关系的概念。 正在对一组与操作定义的关系。 相关的例子包括“是整除”,“是”,“等于”等。所以,“是的实例”是一种关系,“是的子类”是一个关系了。 他们是绝不相同! 一个子类必须是一个类的实例可能是一类,但通常它是别的东西。 如果从本质举个例子:灵长类是哺乳动物的一个子类 - 这是“是的子类”的关系。 莱茜(从电影中的狗)是哺乳动物 - 这是“是的实例”关系的例子。

现在,很可能混淆你的是某种东西的功能,这是别的东西“的实例”是要的东西的类。 这,确实不会发生太大的性质,但这里的东西我能想到的:

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



文章来源: Hierarchy of standard-object and standard-class in Common Lisp