Ada 类型声明语义
Ada Type Declaration Semantics
我在大学里选 Ada。今天我的教授向我们提出了一个问题。在下面的代码中有三个类型声明。第三个没有编译错误 'missing new'。
我假设 'Type' 关键字让编译器知道我们要定义一个存储 class 所以我的问题是:
声明之间的语义差异是什么?
如果省略关键字 Integer,Ada 是否会在指定范围时采用通用整数类型?这似乎是一个显而易见且合乎逻辑的结果。此外,当关键字 'Integer' 在 'range' 之前是新的时,那么需要吗?
我希望这不是模棱两可的,我做了一些研究,但似乎找不到确切的答案,或者我对 Ada 的大部分新手都了解我的发现。我真的很想了解下面发生的事情。
with Ada.Text_IO; use ada.Text_IO;
procedure any is
type abc is new Integer range 1..10;
num : abc;
type def is range 1..10;
num2 : def;
type xyz is Integer range 1..10;
num3 : xyz;
begin
num := 5;
num2 := 6;
num3 := 7;
end any;
在第一个声明中,您声明了一个新类型,与 Integer
不同,但继承了它的一些属性(例如原始函数和运算符,这无关紧要)。
对于每个实际问题,类型 abc
和 def
在这种情况下在语义上是等价的。但是,如果您对基类型进行原始操作,情况就会有所不同。
在这种情况下,您不能真正认为范围的边界具有类型,但如果存在基类型,则它们必须满足在基类型范围内的约束。
现在xyz
根本就是不正确的,Integer在这里没有任何意义。它可能意味着两件事之一:
- 您确实想声明一个从整数派生的新类型。在这种情况下,您缺少 new 关键字。
- 您想声明整数的子类型。就名称解析和静态类型匹配而言,子类型基本上等同于其基类型,但在执行时会有不同的约束。
Furthermore when the keyword 'Integer' is before 'range' is new then required?
Integer
不是关键字,它是标准包中定义的类型。在这个声明中
type A is Integer range 1 .. 10;
Integer
是对 Ada 不期望的类型的引用。它需要一个类型定义,或者一个基本类型。
我在大学里选 Ada。今天我的教授向我们提出了一个问题。在下面的代码中有三个类型声明。第三个没有编译错误 'missing new'。
我假设 'Type' 关键字让编译器知道我们要定义一个存储 class 所以我的问题是:
声明之间的语义差异是什么?
如果省略关键字 Integer,Ada 是否会在指定范围时采用通用整数类型?这似乎是一个显而易见且合乎逻辑的结果。此外,当关键字 'Integer' 在 'range' 之前是新的时,那么需要吗?
我希望这不是模棱两可的,我做了一些研究,但似乎找不到确切的答案,或者我对 Ada 的大部分新手都了解我的发现。我真的很想了解下面发生的事情。
with Ada.Text_IO; use ada.Text_IO;
procedure any is
type abc is new Integer range 1..10;
num : abc;
type def is range 1..10;
num2 : def;
type xyz is Integer range 1..10;
num3 : xyz;
begin
num := 5;
num2 := 6;
num3 := 7;
end any;
在第一个声明中,您声明了一个新类型,与 Integer
不同,但继承了它的一些属性(例如原始函数和运算符,这无关紧要)。
对于每个实际问题,类型 abc
和 def
在这种情况下在语义上是等价的。但是,如果您对基类型进行原始操作,情况就会有所不同。
在这种情况下,您不能真正认为范围的边界具有类型,但如果存在基类型,则它们必须满足在基类型范围内的约束。
现在xyz
根本就是不正确的,Integer在这里没有任何意义。它可能意味着两件事之一:
- 您确实想声明一个从整数派生的新类型。在这种情况下,您缺少 new 关键字。
- 您想声明整数的子类型。就名称解析和静态类型匹配而言,子类型基本上等同于其基类型,但在执行时会有不同的约束。
Furthermore when the keyword 'Integer' is before 'range' is new then required?
Integer
不是关键字,它是标准包中定义的类型。在这个声明中
type A is Integer range 1 .. 10;
Integer
是对 Ada 不期望的类型的引用。它需要一个类型定义,或者一个基本类型。