对象如何成为 class lisp

How can an object be a class lisp

我试图为它想一个更好的名字,但我想不出。 此外,关于此的每个主题都涉及 python 而我不知道 python

我知道最蠢的:meta-classstandar-class

standard-objectstandard-class 的一个实例,每个 class 都是 standard-class 的一个实例,并继承了 standard-object 的所有内容但这怎么可能呢? 至于 standard-object 如何同时成为一个对象和一个 superclass ? 它是如何工作的,为什么?

我不明白的是,一个实例化的 class 怎么可能也是一个 class?

一种思考方式是忘记引导是一个问题,想象对象系统“就是这样”,然后看起来很自然:

  • 万物皆对象
  • 每个对象都是 class
  • 的实例
  • 每个(标准)class 是 standard-object
  • 的子class
  • 一个class是一个对象
  • 每个标准 class 都是一个对象,它是 standard-class
  • 的一个实例
  • standard-class 是一个标准 class,它是一个对象,它是 standard-class 的一个实例,standard-object 的子class 是一个 class 这是一个对象,它是 standard-class
  • 的一个实例

我试过但没有找到合适的图表。

另一种思考方式是引导。怎么才能达到上面的状态呢?

一种方法是,您可以创建一个不存在其 class 的对象:

  1. 决定对象的内存布局
  2. 知道如何在内存中布置 standard-class 的实例,分配一个将成为 class standard-class
  3. 的实例
  4. 用正确的东西初始化那个实例。将它的 class 设置为它自己。暂时不要设置任何 superclasses
  5. 执行相同的操作以分配一个实例,该实例将变为 standard-object(以及层次结构的其他部分,即 class、[=20= 的 class、generic-function, method, 等)
  6. 所有这些对象的class都可以设置为standard-class
  7. 连接 class 层级关系
  8. 创建用于分配实例和编译泛型函数等的泛型函数和方法
  9. 欢迎使用您的新对象系统

您可以反过来问自己这个问题:为什么 class 在面向对象的编程语言中不是对象?

什么是class?它包含有关如何创建新对象的信息,例如字段、默认值等……在 OOP 中,将数据存储在一起的默认工具是对象。所以 CL 的 classes 只是对象!并且因为classes本身就是对象,当然他们有一个class,STANDARD-CLASSSTANDARD-OBJECT是一个class的直接superclass没有任何其他超级classes…cf.Inheritance structure of metaobject classes).

作为练习,您可以尝试创建自己的(非常简单的)对象系统,您可能会很快发现让 classes 成为对象会让您的生活变得更轻松。从那里开始,只有引导的小问题。 :-)