Pascal 在两侧设置不同类型的比较

Pascal 在两侧设置不同类型的比较,pascal,Pascal,以下代码取自GNUPascal测试代码,将在免费的Pascal中很好地编译。我能理解它是如何工作的 var s1 : set of 0..255; s2 : set of 64..128; ok : boolean; procedure p1; begin if s1 = s2 then begin writeln('failed1'); ok := false; end; end; 然而,我有点好奇设置兼容性的规则是什么,以及您可以期望什么。例如:

以下代码取自GNUPascal测试代码,将在免费的Pascal中很好地编译。我能理解它是如何工作的

var s1 : set of 0..255;
    s2 : set of 64..128;
    ok : boolean;

procedure p1;
begin
  if s1 = s2 then begin 
    writeln('failed1');
    ok := false;
  end;
end;
然而,我有点好奇设置兼容性的规则是什么,以及您可以期望什么。例如:

program p;

var
   a : set of 0..10;
   b : set of 20..100;
   s : integer;

begin
   b := [20];
   a := [];
   if a = b then 
     writeln('a')
   else
     writeln('b');
end.
这印的是“b”。但是如果我有两个空集(
b:=[];
),那么它们被认为是相等的

我只是想弄清楚这到底是如何实现的


(我的想法是将这两个集合转换为范围的并集,因此创建了0..100的
集合,并将
a
b
中的两个临时变量作为
0..100的集合,然后比较这些临时变量)。

以整数为基类型的集合(位于
集合
之后的类型)始终兼容

您的假设是正确的:通常,这两个集合都转换为具有公共范围的临时集合,然后比较临时集合。转换是通过调用
fpc\u varset\u load
完成的


如果您对更多详细信息感兴趣,决定如何转换集合的代码位于nadd.pas中(请参阅)从第1593行开始。

谢谢。由于我正在编写自己的编译器,所以我不太看别人的编译器代码。如果编写编译器,可能需要编写编译器所编写语言的书面规范。在Pascal的情况下,您可以考虑ISO/IEC 7185(也称为标准PASCAL)。@Stuart:是的,但是阅读规范并不能解释不同集合类型会发生什么(至少不是我对规范的阅读——而且上面的测试不是我目前正在运行的“iso7185pat.pas”的一部分[并传递,除了从函数转到“main”之外]).在我开始减少不必要的大集合之前,这在我的编译器中并不是一个问题-如果所有集合都是512或1024位长的,不管内容如何,这都不是问题。[至少在你得到
集合-215..117;
集合746..1153
或类似的集合之前]你在使用什么规范?