2017-02-28 192 views
0

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

(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的优先级列表只是本身t。 ​​和structure是否在层次结构中没有类型?

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

  3. 通过与集合论的类比,似乎所有Common Lisp类型/类在理论上可以细分为两个子类t;即,standard-object(对应于元件与像数字3,字符串“abc”,结构s1中,方法M1,等情况下),和standard-class(对应于与实例如类standard-object,所述类别number,类别structure-object等)。如果这不是t的实际细分,是否与实际实施有关;例如,避免层次结构中的递归类关系?

回答

6

类型和类是两个不同的东西。

不要混淆它们。

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

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

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

由于​​不是类,它不能在任何类优先级表。 因此​​不在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 
+0

因为所有的类都有相应的类型,那么假设你可以使用'subtypep'来测试子类以及亚型?同样,如果需要访问实际的类对象,则可以使用'type-of'来发现任何对象的类型(basic或clos),而使用'class-of'? – davypough

2

所有的类都是类型,但不是所有类型都是类。一些类型是根据其他类型定义的。 原子是任何不是缺点。由于结构的实例不是缺点,它是一个原子。从HyperSpec:

Type ATOM

超类型:

原子,叔

描述:

它等同于(not cons)

作为另一个常见的例子,考虑类型列表,这相当于(或空缺点)。 NIL(类型为null)是一个列表,而cons是一个列表。而已。

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

因为我们可以有补充的类型和联合类型和路口类型的类型层次概念变得更加复杂一点,即使仍有适当类层次结构

Hyperspec说结构对象的优先顺序只有 本身和t。原子和结构是否在层次结构中不是类型?

这不像HyperSpec所说的。 HyperSpec说t是超类型结构类型。在Common Lisp中,你可以定义任意的新类型。例如,使用简单的(deftype my-new-type(或结构对象列表)),你会有(typep * p1 *'my-new-type)也会返回true。这并不会突然使HyperSpec关于结构对象的类优先级所说的内容无效。

通过与集理论的比喻,它似乎所有Common Lisp的类型/类理论上可以分为为T的两个子类

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