我似乎无法准确掌握什么名称等价.我很确定我的结构已经下降了.我教授给出的一个例子是:
Type TI=integer
Type TTI=TI
a=integer
b=TTI
f= ref float
g= ref float
Run Code Online (Sandbox Code Playgroud)
a和b都是结构和名称等价的,而f和g只是结构上的等价.我不明白为什么a和b是名字等价的,但f和g不是.
Jer*_*yal 36
输入平等
赋值(在C中用=表示)等基本操作的含义在语言定义中指定.因此,例如,语句的含义如
x = y;
Run Code Online (Sandbox Code Playgroud)
这里将object的值y复制到变量的内存位置x.
但是,在转换器可以接受诸如赋值之类的操作之前,通常两个操作数的类型必须相同(或者可能以某种其他指定的方式兼容).
因此,语言翻译者必须在某些情况下决定两种类型是否相等.我们现在考虑说两种类型"相等"(或等价)意味着什么.
有两种标准方法可以确定两种类型是否相同: 名称等价和结构等价.
名称等价是最直接的:当且仅当它们具有相同的名称时,两种类型是相等的.因此,例如,在代码中(使用C语法)
typedef struct {
int data[100];
int count;
} Stack;
typedef struct {
int data[100];
int count;
} Set;
Stack x, y;
Set r, s;
Run Code Online (Sandbox Code Playgroud)
如果在语言中使用名称等价,x并且y它将是相同的类型,r并且s将具有相同的类型,但是类型x或y不等于r或的类型s.这意味着如
x = y;
r = s;
Run Code Online (Sandbox Code Playgroud)
是有效的,但是如
x = r;
Run Code Online (Sandbox Code Playgroud)
不会有效(即不会被翻译接受).
使用结构等价:,两种类型是相同的,当且仅当它们具有相同的"结构",它可以以不同的方式来解释.
严格的解释是两种类型的每个组件的名称和类型必须相同,并且必须在类型定义中以相同的顺序列出.
不太严格的要求是组件类型必须在两种类型中相同且顺序相同,但组件的名称可能不同.
再看上面的例子,使用结构等价两种类型Stack并且Set被认为是等价的,这意味着翻译者会接受诸如
x = r;
Run Code Online (Sandbox Code Playgroud)
(注意,C它不支持结构等价,并且会给上面的赋值带来错误.)
考虑下面的两个定义。
type student = record
name, address : string
age : integer
type school = record
name, address : string
age : integer
x : student;
y : school;
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,变量 x 和 y 将被认为在名称等价下具有不同的类型:x 使用在第 1 行声明的类型;y 使用在第 4 行声明的类型。名称等效基于这样一个假设:如果程序员努力编写两个类型定义,那么这些定义可能意味着代表不同的类型。(我不确定你给出的例子)
参考:编程语言语用学,ML Scott