一个对象如何成为类Lisp

时间:2018-08-01 22:27:03

标签: oop inheritance common-lisp metaprogramming

我试图为此起一个更好的名字,但我没有。 此外,与此相关的每个主题都涉及python,但我不知道python

我知道dafult line = u"{u'There'}s Still Time': u'foo'}" :meta-class

并且standar-classstandard-object的一个实例,每个类都是standard-class的一个实例,并且继承了standard-class的所有内容,但是这怎么可能? 就像standard-object如何同时成为对象和超类一样? 它是如何工作的以及为什么?

我不明白的是,实例化的班级又如何成为班级?

2 个答案:

答案 0 :(得分:6)

一种思考的方法是,忘记引导是一个问题,并想象对象系统是“正好”,然后看起来自然是这样:

  • 一切都是对象
  • 每个对象都是一个类的实例
  • 每个(标准)类都是standard-object的子类
  • 类是对象
  • 每个标准类都是一个对象,它是standard-class的实例
  • standard-class是一个标准类,它是standard-class实例的对象,而standard-object的子类则是{{ 1}}

我尝试并没有找到好的图表。

对此进行思考的另一种方法是关于引导。您如何使上述状态变为现实?

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

  1. 确定对象的内存布局
  2. 知道如何在内存中布置standard-class的实例,分配一个实例,该实例将成为类standard-class
  3. 使用正确的方法初始化该实例。将其类别设置为本身。尚未设置任何超类
  4. 执行相同的操作以分配一个实例,该实例将成为standard-class(以及层次结构的其他部分,即standard-objectclassT,{{ 1}}等)
  5. 所有这些对象的类都可以设置为generic-function
  6. 连接类层次关系
  7. 创建通用函数和方法以分配实例并编译通用函数等
  8. 欢迎使用您的新对象系统

答案 1 :(得分:3)

您可以反问自己一个问题:在面向对象的编程语言中,为什么类不是对象?

什么是课程?它包含有关如何创建新对象,字段,默认值等内容的信息。在OOP中,将数据存储在一起的默认工具是一个对象。因此,CL的类只是对象!而且,由于类本身就是对象,所以它们当然有一个类STANDARD-CLASSSTANDARD-OBJECT是没有任何其他超类的类的直接超类……参见Inheritance structure of metaobject classes)。

作为练习,您可以尝试创建自己的(非常简单的)对象系统,并且很快就会发现,将类作为对象可以简化您的生活。从那里开始,只有一个自举的小问题。 :-)