【发布时间】:2017-03-01 19:52:55
【问题描述】:
在Common Lisp class hierarchy 的帖子中,Rainer Joswig 和 Joshua Taylor 仔细区分了内置 Common Lisptypes 和 classes 之间的一些区别,其中类构成了一部分CLOS 对基线的扩展。 Pfeil 的综合hierarchy diagram 也反映了类型/类别(加上拖把)的区别。使用该图,似乎可以提取两个不同的层次结构。特别是,我目前对层次结构的顶部最感兴趣;即t 的直接子类型和子类(因为t 既是类型又是类)。以下是从图中提取的一些临时子类型/子类:
对于类型层次结构,t 的直接子类型似乎是atom、character、random-state、hash-table、restart、readtable、package、pathname、 stream、function、array、sequence、number 和 condition。所有其他类型,如 float 或 list 都是这些类型之一的子类型。类型层次结构也不是严格的层次结构(因为(subtype t t) => T,但这似乎是唯一的例外)。 (ps:symbol和structure-object这两种类型不包含在图中,也可能是t的直接子类型。)
对于类层次结构,t 的直接子类包括上述所有类型的对应类(atom 除外,也许structure-object 现在是standard-object(?) 的子类),加上@ 987654350@.
MOP 通过添加类metaobject(加上一些元子类)扩展了CLOS,但似乎没有添加到t 的直接子类。
有人可以验证这种理解是否正确,或提供额外的说明吗?
注意:我在上面的类型层次描述中发现了至少一个错误。所有列出的子类型(character 等)显然都是atom 的子类型,因此它们不是t 的直接子类型。 t 的唯一其他直接子类型似乎是sequence,因为序列可以是cons(非原子)。此外,symbol 实际上包含在图中,也是atom 的子类型。
【问题讨论】:
-
什么是“直接子类型”? Common Lisp 没有定义这样的概念。当
character是T的子类型时,direct subtype是direct subtype,它是atom的子类型?此外,Common Lisp 标准并未为restart等类定义所有超类(以及超类型)。它可能只是T或添加类似structure-object或standard-object的内容。因此,符合要求的实现可能具有不同的类层次结构。为什么要推测?获取您使用的实现并检查它们。大多数都有足够的内省能力,您可以获得类型/类信息。
标签: class types common-lisp