Smalltalk复杂语法

Smalltalk复杂语法,smalltalk,Smalltalk,在一个考试示例中,他们询问语句是否有效,如果有效,返回的内容: 对象类超类 我一个人无法理解那么多信息。求求你,救命 假设Object是类型系统的根,您只需仔细遵循以下规则: 每个普通类X都是其元类X类的实例 每个元类X类都是普通类元类的实例 元类继承图遵循常规对象继承图,除了根对象继承自nil,其元类继承自Class 因此,这将是: | Expression | Type | |-------------------------

在一个考试示例中,他们询问语句是否有效,如果有效,返回的内容:

对象类超类


我一个人无法理解那么多信息。求求你,救命

假设
Object
是类型系统的根,您只需仔细遵循以下规则:

  • 每个普通类
    X
    都是其元类
    X类的实例
  • 每个元类
    X类
    都是普通类
    元类
    的实例
  • 元类继承图遵循常规对象继承图,除了根对象继承自
    nil
    ,其元类继承自
    Class
  • 因此,这将是:

    | Expression | Type | |-------------------------------------|--------------| | Object | Object | | Object class | Object class | | Object class superclass | Class | | Object class superclass class | Class class | | Object class superclass class class | Metaclass | |表达式类型| |-------------------------------------|--------------| |对象|对象| |对象类|对象类| |对象类超类|类| |对象类超类|类类| |对象类超类|元类|
    实际上,
    Object
    不是根,它的父对象
    ProtoObject
    是;因此,如果考试作者考虑到这一点,那么上述内容将以
    元类类

    表达式的一个有趣方面结束

    Object class
    
    Object class superclass
    
    Object class superclass class class
    
    它的答案不是类,而是元类

    对象类
    不是
    的原因是
    元类
    不是
    的子类。更重要的是,
    对象类
    不会继承
    中定义的行为

    当然,人们可能会说,在相同的标准下,
    对象
    不会是
    ,因为它不是
    的实例,而是它的元类(即,
    对象类
    ),但这只是因为一些技术细节(或者实现细节,如果您愿意的话)事实是
    对象
    (以及所有其他类)继承了
    的行为,这就是为什么我们说它们是类,它们的行为就像
    的实例(有趣的是,它们根本没有实例)

    实现此特性的方法在于强制执行以下等式

    ProtoObject class superclass == Class
    
    由于这种关系,
    ProtoObject
    的类端继承了
    class
    的(实例)行为(即使
    class
    没有子类)

    那么,为什么要这样表达呢

    Object class
    
    Object class superclass
    
    Object class superclass class class
    
    有道理吗?如果
    超类
    的接收者甚至不是一个类,它是否应该理解消息
    超类

    答案是肯定的,不仅类而且元类都有一个
    超类
    。在这里,原因再次与遗传行为有关

    每个程序员都希望,如果类
    A
    继承自
    B
    ,那么
    A类
    将继承
    B
    类端的所有方法。换句话说,

    A class superclass == B class
    
    或者,相当于

    A class superclass == A superclass class
    
    但是请注意,正如我们在上面看到的(
    ProtoObject-class-superclass==class
    ),这种关系不适用于
    A==ProtoObject

    因此,在存在
    ProtoObject
    的情况下

    Object class
    
    Object class superclass
    
    Object class superclass class class
    
    变成

    Object superclass class class class
    

    因为
    ProtoObject类
    元类
    的一个实例,所以它的
    元类

    为了完成答案,让我们计算一下

    ProtoObject class superclass class class
    
    在这种情况下,我们得到

    Class class class
    


    哦。。当我分别理解每个单词,而几乎不一起理解任何东西时,情况就是这样。所以对象类返回对象类。对象类超类返回类。Class Class返回元类?@GregoryKornblum将消息
    Class
    发送到名称以空格结尾并后跟“Class”的任何对象,都将返回
    Metaclass
    。您的意思是,xxxxxx Class始终返回元类?@GregoryKornblum正确,只要xxxxxx是类的名称<例如,code>3类类
    ,将返回类似于
    SmallInteger类
    @Oak的内容,您是否检查了表?您始终可以运行它并查看结果,对吗?相信我,我检查过了。问题是,他们不允许笔记本电脑进入教室:)直到现在我还确信我不需要记住那张糟糕的遗传图。所以我还是希望不会。这取决于这里的解释:)我从没想过我会在同一个句子中看到“棘手的语法”和“Smalltalk”这两个词!Smalltalk是我所知道的最简单的语法之一,仅次于Lisp(s)和Io。它不是一个复杂的语法,只是一个消息发送链。但这是一个棘手的问题,在我谦逊的小人看来,这是一个糟糕的问题。作为Smalltalk代码,它很臭。谁会写这样的咒语?任何想要理解底层类/元类结构的人,但是你可以用一种交互的方式来理解,然后扔掉它。没有交互,它只是死气沉沉的丑陋代码。如果结果是你觉得Smalltalk很棘手,那么这完全是教学失败@GregoryKornblum:语义可能很棘手,但你没有问语义,而是问语法,Smalltalk是所有编程语言中最简单的语法之一。在您发布的代码中,正好有两个语法元素:一个类引用和4个消息发送。消息发送总是严格地从左到右求值,这也比其他语言简单得多,例如在Ruby中
    2*3+4
    是从左到右求值的,而
    2+3*4
    不是,因此求值顺序取决于消息的名称,而Smalltalk中不是这样。