Common Lisp class 层次结构
Common Lisp class hierarchy
Greg Pfeil 的 Class Hierarchy 图表提供了 Common Lisp 类型系统的综合图景。但我试图更好地理解层次结构顶部的 class 关系。举个简单的例子,让(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
Hyperspec 表示 structure-object
的优先级列表只有它自己和 t
。
atom
和 structure
不是层次结构中的类型吗?
t
的所有直接子类型是什么?更一般地说,如何检索任何给定类型的所有直接子类型或超类型(无需反复试验 subtypep
)?或者,有没有办法遍历所有类型的列表? MOP 提供的功能是否完全 sub-/super-classes?
类比集合论,似乎所有 Common Lisp types/classes 理论上都可以细分为 t
的两个子class;即,standard-object
(对应于 元素 ,其中包含数字 3、字符串 "abc"、结构 s1、方法 m1 等实例),以及 standard-class
(对应于 sets 以及 class standard-object
、class number
、class structure-object
,等等)。如果这不是t
的实际细分,是不是和实际实现有关系?例如,避免层次结构中的递归 class 关系?
所有 class 都是类型,但并非所有类型都是 class 类型。一些 类型 是根据其他类型定义的。 atom 是任何不是 cons 的东西。由于结构的实例不是缺点,它是一个原子。来自 HyperSpec:
Supertypes:
atom, t
Description:
It is equivalent to (not cons)
.
作为另一个常见的例子,考虑类型 list,它等价于 (或 null cons)。 NIL(null 类型)是一个列表,cons 是一个列表。就是这样。
atom 和 list 都不是 class,但它们是类型。
因为我们可以有互补类型、联合类型和交集类型,类型层次结构的概念变得有点复杂,即使仍然有适当的 class 层级.
The Hyperspec says the precedence list for structure-object is only
itself and t. Are atom and structure not types in the hierarchy?
这与 HyperSpec 所说的不完全相同。 HyperSpec 说 t 是 structure-type 的超类型。在 Common Lisp 中,您可以定义任意新类型。例如,使用简单的 (deftype my-new-type (or structure-object list)),你会得到 (typep *p1* 'my-new- type) return 也为真。这并没有突然使 HyperSpec 关于 structure-object.
的 class 优先级的说法无效
By analogy with set theory, it would seem that all Common Lisp types/classes could theoretically be subdivided into two subclasses of t
这将是一种实现方式,但是由于能够根据类型的并集、类型的交集和类型的补集来定义新类型,因此您可以通过多种方式来划分对象Common Lisp 按类型分类。
类型和 classes 是两个不同的东西。
不要混淆他们。
有些类型有对应的classes。大多数没有。
atom
是类型的名称,而不是 class.
CL-USER 18 > (find-class 'atom nil)
NIL
因为 atom
不是 class,它不能在任何 class 优先级列表中。
因此 atom
不在 structure-object
的 class 优先级列表中。
类型 structure
是非标准的,未由 ANSI CL 定义。
类型不在 class 优先列表中,class 是。
类型接口:
- 创建类型 ->
DEFTYPE
- 是某种类型的东西吗? ->
TYPEP
- 一种类型是另一种类型的子类型吗? ->
SUBTYPEP
- 什么是类型? ->
TYPE-OF
这基本上就是您可以使用类型做的所有事情。
CLOS classes有对应的类型
CLOS 函数和 class 优先级列表不适用于类型,但 classes 有相应的类型。
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 适用于 classes。因此,在扩展的 CLOS 中,您可以请求 subclasses 和 superclasses。但不适用于子类型或超类型。
历史:类型和 CLOS
Common Lisp 始于 CLtL1,具有类型,没有 CLOS。
CLOS 和 CLOS classes 是几年后添加的。它们的添加方式使得 一些 类型得到相应的 classes 并且 classes 具有相应的类型。
Common Lisp 允许使用 AND
、OR
、SATISFIES
、MEMBER
、NOT
等类型说明符来定义类型不存在相应的 CLOS class。
还有像(integer 0 100)
这样的复合类型说明符。这些类型也没有相应的 CLOS class。
CL-USER 31 > (deftype integer100 () '(integer 0 100))
INTEGER100
CL-USER 32 > (find-class 'integer100)
Error: INTEGER100 is not the name of a class
Greg Pfeil 的 Class Hierarchy 图表提供了 Common Lisp 类型系统的综合图景。但我试图更好地理解层次结构顶部的 class 关系。举个简单的例子,让(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
Hyperspec 表示
structure-object
的优先级列表只有它自己和t
。atom
和structure
不是层次结构中的类型吗?t
的所有直接子类型是什么?更一般地说,如何检索任何给定类型的所有直接子类型或超类型(无需反复试验subtypep
)?或者,有没有办法遍历所有类型的列表? MOP 提供的功能是否完全 sub-/super-classes?类比集合论,似乎所有 Common Lisp types/classes 理论上都可以细分为
t
的两个子class;即,standard-object
(对应于 元素 ,其中包含数字 3、字符串 "abc"、结构 s1、方法 m1 等实例),以及standard-class
(对应于 sets 以及 classstandard-object
、classnumber
、classstructure-object
,等等)。如果这不是t
的实际细分,是不是和实际实现有关系?例如,避免层次结构中的递归 class 关系?
所有 class 都是类型,但并非所有类型都是 class 类型。一些 类型 是根据其他类型定义的。 atom 是任何不是 cons 的东西。由于结构的实例不是缺点,它是一个原子。来自 HyperSpec:
Supertypes:
atom, t
Description:
It is equivalent to
(not cons)
.
作为另一个常见的例子,考虑类型 list,它等价于 (或 null cons)。 NIL(null 类型)是一个列表,cons 是一个列表。就是这样。
atom 和 list 都不是 class,但它们是类型。
因为我们可以有互补类型、联合类型和交集类型,类型层次结构的概念变得有点复杂,即使仍然有适当的 class 层级.
The Hyperspec says the precedence list for structure-object is only itself and t. Are atom and structure not types in the hierarchy?
这与 HyperSpec 所说的不完全相同。 HyperSpec 说 t 是 structure-type 的超类型。在 Common Lisp 中,您可以定义任意新类型。例如,使用简单的 (deftype my-new-type (or structure-object list)),你会得到 (typep *p1* 'my-new- type) return 也为真。这并没有突然使 HyperSpec 关于 structure-object.
的 class 优先级的说法无效By analogy with set theory, it would seem that all Common Lisp types/classes could theoretically be subdivided into two subclasses of t
这将是一种实现方式,但是由于能够根据类型的并集、类型的交集和类型的补集来定义新类型,因此您可以通过多种方式来划分对象Common Lisp 按类型分类。
类型和 classes 是两个不同的东西。
不要混淆他们。
有些类型有对应的classes。大多数没有。
atom
是类型的名称,而不是 class.
CL-USER 18 > (find-class 'atom nil)
NIL
因为 atom
不是 class,它不能在任何 class 优先级列表中。
因此 atom
不在 structure-object
的 class 优先级列表中。
类型 structure
是非标准的,未由 ANSI CL 定义。
类型不在 class 优先列表中,class 是。
类型接口:
- 创建类型 ->
DEFTYPE
- 是某种类型的东西吗? ->
TYPEP
- 一种类型是另一种类型的子类型吗? ->
SUBTYPEP
- 什么是类型? ->
TYPE-OF
这基本上就是您可以使用类型做的所有事情。
CLOS classes有对应的类型
CLOS 函数和 class 优先级列表不适用于类型,但 classes 有相应的类型。
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 适用于 classes。因此,在扩展的 CLOS 中,您可以请求 subclasses 和 superclasses。但不适用于子类型或超类型。
历史:类型和 CLOS
Common Lisp 始于 CLtL1,具有类型,没有 CLOS。
CLOS 和 CLOS classes 是几年后添加的。它们的添加方式使得 一些 类型得到相应的 classes 并且 classes 具有相应的类型。
Common Lisp 允许使用 AND
、OR
、SATISFIES
、MEMBER
、NOT
等类型说明符来定义类型不存在相应的 CLOS class。
还有像(integer 0 100)
这样的复合类型说明符。这些类型也没有相应的 CLOS class。
CL-USER 31 > (deftype integer100 () '(integer 0 100))
INTEGER100
CL-USER 32 > (find-class 'integer100)
Error: INTEGER100 is not the name of a class