Common Lisp类层次结构

时间:2017-02-28 16:39:41

标签: types common-lisp class-hierarchy clos

Greg Pfeil的Class Hierarchy图提供了Common Lisp类型系统的全面图片。但我试图更好地理解层次结构顶部的类关系。举一个简单的例子,让(defstruct person name age),然后(defparameter *p1* (make-person :name "Yosh" :age 19)。现在

(typep *p1* 'person)
T
(typep *p1* 'structure)
T
(typep *p1* 'structure-object)
T
(typep *p1* 'atom)
T
(typep *p1* t)
T
  1. Hyperspec表示structure-object的优先级列表仅为其自身且tatomstructure不是层次结构中的类型吗?

  2. t的所有直接子类型是什么?更一般地说,如何检索任何给定类型的所有直接子类型或超类型(没有反复试验subtypep)?或者,有没有办法迭代所有类型的列表? MOP是否提供了获取所有子/超类的功能?

  3. 通过类比集理论,似乎理论上所有Common Lisp类型/类都可以细分为t的两个子类;即,standard-object(对应于元素,其实例如数字3,字符串" abc",结构s1,方法m1等),以及{ {1}}(对应于使用类standard-class,类standard-object,类number等实例设置)。如果这不是structure-object的实际细分,那么原因是否与实际实施有关;例如,避免层次结构中的递归类关系?

2 个答案:

答案 0 :(得分:7)

类型和类是两回事。

不要混淆他们。

某些类型具有相应的类。大多数人没有。

atom是类型的名称,但不是类的名称。

CL-USER 18 > (find-class 'atom nil)
NIL

由于atom不是类,因此不能在任何类优先级列表中。 因此atom不在structure-object的类优先级列表中。

类型structure是非标准的,不是由ANSI CL定义的。

类型不在类优先级列表中,类是。

类型的界面:

  • 创建一个类型 - > DEFTYPE
  • 是什么类型的? - > TYPEP
  • 是另一种类型的子类型? - > SUBTYPEP
  • 什么是某种类型的东西? - > TYPE-OF

这基本上只能用类型来做。

CLOS类具有相应的类型

CLOS函数和类优先级列表不适用于类型,但类具有相应的类型。

CL-USER 23 > (defclass bar () ())
#<STANDARD-CLASS BAR 40200A2413>

CL-USER 24 > (typep (make-instance 'bar) 'bar)
T

CL-USER 25 > (type-of (make-instance 'bar))
BAR

CL-USER 26 > (class-of (make-instance 'bar))
#<STANDARD-CLASS BAR 40200A2413>

CLOS适用于类。因此,在扩展的CLOS中,您可以请求子类和超类。但不适用于亚型或超类型。

历史:类型和CLOS

Common Lisp在CLtL1中以类型而不是CLOS开始。

CLOS和CLOS课程已在几年后添加。它们的添加方式使得某些类型具有相应的类,并且类具有相应的类型。

Common Lisp允许使用类型说明符来定义类型,例如ANDORSATISFIESMEMBERNOT,...对于那些没有对应的存在CLOS类。

还有复合类型说明符,如(integer 0 100)。这些类型也没有相应的CLOS类。

CL-USER 31 > (deftype integer100 () '(integer 0 100))
INTEGER100

CL-USER 32 > (find-class 'integer100)

Error: INTEGER100 is not the name of a class

答案 1 :(得分:2)

所有类都是类型,但并非所有类都是类。某些类型是根据其他类型定义的。 原则是指不是缺点的任何内容。由于结构的实例不是缺点,因此它是一个原子。来自HyperSpec:

  

Type ATOM

     

<强>超类型:

     

atom,t

     

说明

     

相当于(not cons)

作为另一个常见示例,请考虑类型列表,它等同于(或null cons)。 NIL(类型为null)是一个列表,缺点是列表。那就是它。

原子列表都不是类,但它们是类型。

因为我们可以有补充类型和联合类型以及交集类型,所以类型层次结构的概念变得有点复杂,即使仍有正确的类层次结构

  

Hyperspec表示结构对象的优先级列表是唯一的   本身和t。原子和结构在层次结构中不是类型吗?

这不是HyperSpec所说的。 HyperSpec表示 t 结构类型的超类型。在Common Lisp中,您可以定义任意新类型。例如,使用简单的(deftype my-new-type(或结构对象列表)),您就拥有(typep * p1 *&#39; my-new-类型)也返回true。这并没有突然使HyperSpec对 structure-object 的类优先级所说的内容无效。

  

通过类比集理论,似乎所有Common Lisp类型/类在理论上可以细分为两个子类t

这将是一种方法,但由于能够根据类型的组合,类型的交集和类型的补充来定义新类型,有许多方法可以对Common Lisp的对象进行分区按类型。