Types 公共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 表

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
  • 表示
    结构对象
    的优先级列表仅为自身和
    t
    atom
    structure
    是否不是层次结构中的类型

  • t
    的所有直接子类型是什么?更一般地说,您如何检索任何给定类型的所有直接子类型或超类型(无需反复试验
    子类型p
    )?或者,是否有方法迭代所有类型的列表?MOP是否提供获取所有子类/超类的函数

  • 通过与集合论的类比,似乎所有常见的Lisp类型/类在理论上都可以细分为
    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