【问题标题】:Hierarchy of standard-object and standard-class in Common LispCommon Lisp 中标准对象和标准类的层次结构
【发布时间】:2012-10-10 08:29:04
【问题描述】:

我正在学习 Common Lisp(使用 Lispworks),我现在正在尝试进入课堂系统。有一个名为 standard-object 的类,它被定义为

standard-object 类是 standard-class 的实例,并且是 standard-class 实例的每个类的超类> 除了它自己。

(取自http://www.lispworks.com/documentation/HyperSpec/Body/t_std_ob.htm#standard-object) 所以它是 standard-class

的一个实例

另一方面,standard-classstandard-object

的子类
>(subtypep 'standard-class 'standard-object)
=>T, T

标准对象如何既是标准类的超类又是它的实例?如果我们将标准类定义为子类型,我们应该在定义其超类型(例如标准对象)之后定义它,那么超类如何成为实例呢?还是我的逻辑错了?

【问题讨论】:

    标签: lisp common-lisp clos


    【解决方案1】:

    CLOS 是一个对象系统,其中 CLOS 概念本身就是一流的对象。类本身就是元类的实例。存在一定的循环性。

    有一个实例standard-object。这是standard-class 的一个实例。它本身就是一个类。所有标准 CLOS 对象都将其作为超类。还有其他类型的对象,例如结构。所以standard-object 是所有典型 CLOS 对象的超类。

    standard-class 是其自身的实例。它是所有类对象的类。由于standard-object 也是一个类,所以standard-object 类的实例是standard-class 类的一个实例。由于所有标准类也是 CLOS 对象,standard-class 继承自 standard-object

    CL-USER 22 > (class-of (find-class 'standard-object))
    #<STANDARD-CLASS STANDARD-CLASS 40F016A063>
    

    standard-object类对象的类是standard-class

    CL-USER 23 > (class-of (find-class 'standard-class))
    #<STANDARD-CLASS STANDARD-CLASS 40F016A063>
    

    standard-class 类对象的类是standard-class

    CL-USER 24 > (find-class 'standard-object)
    #<STANDARD-CLASS STANDARD-OBJECT 40F017732B>
    

    standard-object 类本身就是一个对象和一个类。它是所有 CLOS 对象的超类。

    CL-USER 25 > (find-class 'standard-class)
    #<STANDARD-CLASS STANDARD-CLASS 40F016A063>
    

    standard-class 类本身就是一个对象和一个类。它是所有 CLOS 类的超类。

    【讨论】:

    • 谢谢!有了这些例子,我现在似乎明白了。
    • 从第 页开始。元对象协议的艺术附录 D 中的 306,显示了引导类 CLOS 语言的代码;包括如何解开所有的循环;我发现它内容丰富,虽然我还不能说我完全理解它。
    【解决方案2】:

    要理解这一点,您需要了解meta class 的概念。元类的实例是类,类的实例是对象,所以基本上我们有 3 级层次结构。

    standard-class 是一个元类。 standard-object 是元类 standard-class 的一个实例,因此它是类。默认情况下,所有其他用户定义的类都继承自 standard-object 类。

    所以当你创建一个类时,你基本上是在实例化standard-class 元类,而这个新类被standard-object 类继承。

    【讨论】:

    • 好的,我想我了解元类是什么,但我们是否同时定义standard-objectstandard-class?在我看来,一切都是这样发生的:0)我们定义类T; 1)我们定义类standard-object,它是T的子类型;没有standard-class! 2) 我们将standard-class 定义为standard-object 的子类型并使其成为元类 3) standard-object 成为standard-class 的实例是不是?我觉得有点奇怪。
    • 标准类不是标准对象的子类型。标准对象是标准类的一个实例
    • 那为什么(subtypep 'standard-class 'standard-object)给出答案true
    【解决方案3】:

    我将尝试只回答一个似乎让您感到困惑的问题:

    标准对象如何成为标准类的超类并成为其 同时实例?

    我希望你熟悉数学中的关系概念。在具有操作的集合上定义的关系。关系的例子包括“被整除”、“是一个”、“等于”等。所以,“是的实例”是一个关系,“是一个子类”也是一个关系。它们绝不相同!一个子类必须是一个类,一个实例可能是一个类,但通常它是别的东西。如果你从自然界举个例子:灵长类动物是哺乳动物的一个子类——这就是“是一个子类”的关系。 Lassie(电影中的一条狗)是一种哺乳动物——这是“is instance of”关系的一个例子。

    现在,可能让您感到困惑的是,某事物的功能,即其他事物的“实例”,是该事物的类。这在自然界中确实不会发生太多,但这是我能想到的:

    语言和语法。语法是一组规则,它定义了一种语言,语法本身也是一种语言(即它“是”语言的子类),而语言实例化了语法规则,因此语言“是”语法的一个实例。

    【讨论】:

    • 那个语法例子绝对很棒,非常感谢,我现在什么都知道了!我觉得在定义中有类似循环之类的错误,但现在看起来还不错。
    猜你喜欢
    • 2016-02-24
    • 2014-01-30
    • 2012-11-06
    • 2022-01-04
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    相关资源
    最近更新 更多