4

我试图弄清楚 Oberon 是否允许对记录中的字段进行寻址,该字段在所述记录的类型声明中不存在,但仅在其扩展之一中,并且在没有类型保护的情况下这样做。

在 PIO (" Programming in Oberon ") 第 62 页,第一段的最后一句,Wirth 写道 (1):

我们对面向对象编程范式的简要介绍到此结束。我们意识到几乎不需要向 Oberon 添加任何语言功能来支持它。除了已经存在的记录和过程类型的设施之外,只有类型扩展的概念是必要和关键的。它允许构建类型的层次结构并构建非同质的数据结构。由于放弃了严格静态类型的规则,动态类型测试的引入变得必要。类型保护的进一步设施仅仅是一种方便。

在 PIO 第 59 页,第 23.2 节之前最后一段的前三句话,他写道 (2):

简单的指示符 p.radius 是不可接受的,因为 p 是 Figure 类型,它没有场半径。使用类型保护,程序员可以确定在这种情况下 p 也是 Circle 类型,在这种情况下,字段半径确实适用。而 p 是基本类型Figure,p(Circle) 是 Circle 类型。

一方面,我将 #2 解释为,为了能够处理不在指示符类型声明中的字段,类型保护是绝对必要的。如果不是类型保护,寻址这样的字段应该会导致编译时错误。

另一方面,如果类型保护只是如#1 所建议的那样方便,那么它也可以被省略。它的功能只是断言的功能,因此编译器可以允许对不在指示符类型声明中的字段进行寻址。

由于后者不是类型安全的,如果 Wirth 是这样打算的,我会感到惊讶。

因此,我倾向于完全无视#1并实施#2。

在我通过电子邮件打扰 Wirth 之前,如果 Oberon 的从业者(和编译器实现者)可以分享在他们各自的 Oberon 编译器中是如何解释的,我将不胜感激。

提前致谢

4

1 回答 1

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 节中描述。

于 2015-10-31T13:45:17.597 回答