Types 公共Lisp类层次结构
Greg Pfeil的图表提供了通用Lisp类型系统的全面图片。但我试图更好地理解层次结构顶部的类关系。举个简单的例子,现在让Types 公共Lisp类层次结构,types,common-lisp,class-hierarchy,clos,Types,Common Lisp,Class Hierarchy,Clos,Greg Pfeil的图表提供了通用Lisp类型系统的全面图片。但我试图更好地理解层次结构顶部的类关系。举个简单的例子,现在让(defstruct人名年龄),然后(defsparameter*p1*(make person:name“Yosh”:19岁) (typep *p1* 'person) T (typep *p1* 'structure) T (typep *p1* 'structure-object) T (typep *p1* 'atom) T (typep *p1* t) T 表
(defstruct人名年龄)
,然后(defsparameter*p1*(make person:name“Yosh”:19岁)
(typep *p1* 'person)
T
(typep *p1* 'structure)
T
(typep *p1* 'structure-object)
T
(typep *p1* 'atom)
T
(typep *p1* t)
T
结构对象
的优先级列表仅为自身和t
。
atom
和structure
是否不是层次结构中的类型t
的所有直接子类型是什么?更一般地说,您如何检索任何给定类型的所有直接子类型或超类型(无需反复试验子类型p
)?或者,是否有方法迭代所有类型的列表?MOP是否提供获取所有子类/超类的函数t
的两个子类;即标准对象
(对应于具有数字3、字符串“abc”、结构s1、方法m1等实例的元素)和标准类
(对应于具有诸如类标准对象
、类编号
、类结构对象
等实例的集合)。如果这不是t
的实际细分,原因是否与实际实现有关;例如,避免层次结构中的递归类关系所有类都是类型,但并非所有类型都是类。某些类型是根据其他类型定义的。atom是任何不是cons的东西。由于结构实例不是cons,所以它是atom。从HyperSpec: 超类型: 原子,t 说明: 它相当于
(不是cons)
作为另一个常见的例子,考虑类型<强>列表< /St>,它相当于<强>(或null CONS)。nIL(类型null)是一个列表,而CONS是一个列表。就是这样。 原子和列表都不是类,而是类型
因为我们可以有补码类型、并集类型和交集类型,所以类型层次结构的概念变得更加复杂,即使仍然有适当的类层次结构 Hyperspec表示结构对象的优先级列表仅为 原子和结构不是层次结构中的类型吗 这并不是HyperSpec所说的。HyperSpec说t是结构类型的超类型。在常见的Lisp中,您可以定义任意的新类型。例如,使用一个简单的(deftype my new type(或structure object list)),您将拥有(typep*p1*“my new type)也返回true。这不会突然使HyperSpec关于结构对象的类优先级的说法失效 通过与集合论的类比,似乎所有常见的Lisp类型/类在理论上都可以细分为t的两个子类这可能是一种方法,但由于能够根据类型的并集、类型的交集和类型的补充来定义新类型,因此有许多方法可以按类型划分Common Lisp的对象。类型和类是两件不同的事情。 别把他们弄糊涂了 有些类型有相应的类,大多数没有
atom
是类型的名称,但不是类的名称
CL-USER 18 > (find-class 'atom nil)
NIL
由于atom
不是类,因此它不能在任何类优先级列表中。
因此,atom
不在结构对象的类优先级列表中
类型结构
是非标准的,未由ANSI CL定义
类型不在类优先级列表中,类是
类型的接口:
- 创建类型->
DEFTYPE
- 是某种类型的东西吗?->
TYPEP
- a型是另一种类型的子类型吗?->
subpitp
- 什么是某物的类型?->
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>
由于所有类都有相应的类型,那么假设您可以只使用subtype p
来测试子类和子类型?类似地,如果您需要访问实际的类对象,您可以只使用type of
来发现任何对象(basic或clos)的类型,而使用class of
?
CL-USER 31 > (deftype integer100 () '(integer 0 100))
INTEGER100
CL-USER 32 > (find-class 'integer100)
Error: INTEGER100 is not the name of a class