我试图弄清楚Oberon是否允许对记录中的字段进行寻址,该记录不存在于所述记录的类型声明中,而是仅在其一个扩展中进行,并且没有类型保护。
在PIO ("Oberon编程")第62页第一段的最后一句中,Wirth写道(1):
这是我们对面向对象编程范式的简要介绍。我们意识到,几乎没有任何语言特性需要添加到Oberon来支持它。除了现有的记录和程序类型的便利之外,只有类型扩展的概念是必要和关键的。它允许构造类型的层次结构和构建非同构的数据结构。由于放弃了严格静态类型的规则,引入动态类型测试变得非常必要。,类型保护的进一步设施仅仅是一个方便的.
在PIO第59页中,他在第23.2页前最后一段的前三句写道:
简单的指示符p.radius是不可接受的,因为p是图形型的,它不具有字段半径。使用类型保护,程序员可以确定在这种情况下p也是圆型,在这种情况下,字段半径确实是适用的。而p是基型图形,p(圆)是圆型。
一方面,我对#2的解释是,类型保护是绝对必要的,以便能够处理不在指定程序类型声明中的字段。如果不是因为类型保护,那么处理这样的字段就会导致编译时错误。
另一方面,如果类型保护只是#1所建议的一个方便的,那么它也可以省略。它的功能只是一个断言,因此编译器可以允许寻址一个不在指示符类型声明中的字段。
因为后者不是类型安全,如果Wirth打算这样做的话,我会感到惊讶。
因此,我倾向于完全忽略#1并实现#2。
在我用电子邮件打扰Wirth之前,我希望Oberon从业者(和编译器实现者)能够分享他们各自的Oberon编译器是如何解释这一点的。
提前感谢
发布于 2015-10-31 13:45:17
我给威思教授发邮件要求澄清。
原来,在早期的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
案例说明见第9.5节。
https://stackoverflow.com/questions/33387217
复制相似问题