我试图弄清楚Oberon是否允许在记录中的字段中寻址,该记录在所述记录的类型声明中不存在,但仅在其中一个扩展中执行没有类型保护 。
在PIO(“Programming in Oberon”)第62页,第一个paragaph的最后一句,Wirth写道(1):
我们简要介绍了面向对象的范例 编程。我们意识到几乎没有语言特征 加入Oberon以支持它。除了已经存在的 记录和程序类型的设施,只有类型的概念 延伸既是必要也是至关重要的。它允许构建 类型的层次结构和构建不同的数据结构。作为一个 放弃严格静态打字规则的后果 动态类型测试的介绍变得必要。 更进一步 类型保护设施只是方便之一。
在PIO第59页中,在第23.2节之前的最后一段的前三句话中写道(2):
简单的指示符p.radius是不可接受的,因为p是Figure类型,它没有字段半径。通过类型保护,程序员可以确定在这种情况下p也是Circle类型,在这种情况下,场半径确实适用。 而p是基本类型图,p(圆圈)是Circle类型。
一方面,我解释#2使得类型后卫绝对必要,以便能够处理不在指定者类型声明中的字段。如果不是类型保护,解决这样的字段应该导致编译时错误。
另一方面,如果类型保护是仅仅是方便,如#1所示,那么它也可以省略。它的设施只是一个断言,因此编译器可以允许寻址不在指定者类型声明中的字段。
由于后者不是类型安全的,如果Wirth这样做,我会感到惊讶。
因此,我倾向于完全无视#1并实施#2。
在我用电子邮件打扰Wirth之前,如果Oberon从业者(和编译器实施者)可以分享在各自的Oberon编译器中如何解释这一点,我会很感激。
提前致谢
答案 0 :(得分:4)
我通过电子邮件通知Wirth教授要求澄清。
事实证明,在早期的Oberon语言报道声明"仅仅是方便"确实有误导性,因为在Oberon的这些版本中,类型保护语法对于解决基类型中不存在的扩展字段是必要的。没有其他办法可以做到这一点。
然而,正如Wirth指出的那样,在他最新的Oberon修订版中,CASE语句的语义已经扩展到对基本类型中不存在的扩展中的字段进行类型测试和寻址。
CASE msg OF
DrawMsg : msg.draw(self)
| MoveMsg : msg.move(self, msg.dx, msg.dy)
...
在这种情况下,IS类型测试和类型保护语法都不是必需的。因此,在目前的Oberon版本中,它们确实只是方便。
最新Oberon版本的语言报告可在以下网址找到:
https://www.inf.ethz.ch/personal/wirth/Oberon/Oberon07.Report.pdf
CASE声明在9.5节中描述。