Greg Pfeil 的 Class Hierarchy 图提供了 Common Lisp 类型系统的综合图。但我试图更好地理解层次结构顶部的类关系。举个简单的例子,先是 (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 的优先级列表只有它自己和 tatomstructure 不是层次结构中的类型吗?
  • t 的所有直接子类型是什么?更一般地说,您如何检索任何给定类型的所有直接子类型或父类(super class)型(没有反复试验 subtypep )?或者,有没有办法遍历所有类型的列表? MOP 是否提供获取所有子/父类(super class)的功能?
  • 与集合论类比,似乎所有 Common Lisp 类型/类理论上都可以分割为 t 的两个子类;即,standard-object(对应于具有数字 3、字符串“abc”、结构 s1、方法 m1 等实例的元素)和 standard-class(对应于具有类 standard-object 、类 number 、类 structure-object 等)。如果这不是 t 的实际分割,原因是否与实际实现有关;例如,避免层次结构中的递归类关系?
  • 最佳答案

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

    不要混淆它们。

    有些类型有相应的类。大多数没有。
    atom 是类型的名称,而不是类的名称。

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

    由于 atom 不是一个类,它不能在任何类优先级列表中。
    因此 atom 不在 structure-object 的类优先级列表中。
    structure 类型是非标准的,并且不是由 ANSI CL 定义的。

    类型不在类优先级列表中,类在。

    类型接口(interface):
  • 创建一个类型 -> 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 中,您可以要求子类和父类(super class)。但不适用于子类型或父类(super class)型。

    历史:类型和 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
    

    关于types - Common Lisp 类层次结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42514204/

    10-12 20:25