【问题标题】:How can an object be a class lisp一个对象怎么可能是一个类 lisp
【发布时间】:2019-01-09 14:28:21
【问题描述】:

我试图为它想一个更好的名字,但我想不出来。 另外,这方面的每个主题都涉及python,我不知道python

我知道傻逼:meta-classstandar-class

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

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

【问题讨论】:

  • 您查看了哪些文档,它们的不足之处在哪里?
  • lisp 食谱、lispworks IDE 文档、cs.cmu.edu/Groups/AI/html/cltl/clm/index.html 和谷歌...
  • 您是否尝试过实现简单的解释器或类系统?如果你知道,你会知道引导程序和递归一样神奇,而且有点自相矛盾。 standard-object inherits standard-object
  • 一本描述如何写一本书的书怎么可能是一本书本身呢?为什么?
  • 您可能会在“元对象协议的艺术”中找到答案,它们展示了 CLOS 的布局方式并解释了引导问题。

标签: oop inheritance common-lisp metaprogramming


【解决方案1】:

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

  • 一切都是对象
  • 每个对象都是类的一个实例
  • 每个(标准)类都是standard-object 的子类
  • 类就是对象
  • 每个标准类都是一个对象,它是standard-class 的一个实例
  • standard-class 是一个标准类,它是一个对象,它是 standard-class 的实例和 standard-object 的子类,这是一个类,它是一个对象,它是 standard-class 的实例

我尝试过,但没有找到一个好的图表。

另一种思考方式是关于引导。怎样才能让上面的状态变成这样?

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

  1. 决定对象的内存布局
  2. 知道如何在内存中布置standard-class 的实例,分配一个将成为standard-class 类的实例
  3. 用正确的东西初始化该实例。将其类设置为自身。暂时不要设置任何超类
  4. 同样分配一个实例,该实例将变为standard-object(以及层次结构的其他部分,即classTgeneric-functionmethod 等的类)
  5. 所有这些对象的类都可以设置为standard-class
  6. 连接类层次关系
  7. 创建用于分配实例和编译通用函数等的通用函数和方法
  8. 欢迎使用您的新对象系统

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我认为“什么是类”的一个可接受的答案可能是“一个类仅在编译时存在并且被转换为专门的函数调用和一个 vtable”或“一个类是一个特殊的非- 只能通过名称引用的运行时事物[并且可以通过...进行内省]”
    • 您确实帮了很多忙,我还阅读了stackoverflow.com/questions/12815105/…,它回答了我的下一个问题,但我对此有疑问。 'standard-class' 基本上是根对吗?然后我们有standard-object,它本身是standard-class 的一个实例,然后我们有一个单独的standard-class object-class,它是'standard-class' 的一个实例,并且standard-object 的子类对吗?我花了很多时间来理解这一点。
    • 我认为这是令人困惑的部分,但这仅仅是因为引导和实现。您的描述是正确的,但我认为根是standard-object,因为它是任何没有显式超类的类的默认超类。引导这意味着:创建standard-object,然后创建standard-class,然后将standard-object 的类设置为standard-class,对standard-class 执行相同操作。当您观察最终结果时,会感到困惑……
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2016-09-15
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多