设置与两侧不同类型的比较

Set comparison with different types on either side

以下代码取自 Gnu Pascal 测试代码,可以在 Free 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 := [];)那么它们被认为是相等的。

我只是想了解这实际上是如何实现的。

(我的想法是这两个集合被转换为范围的并集,所以 set of 0..100 被创建,并且两个临时值来自 abset of 0..100,然后比较这些临时对象)。

以整数为基本类型(set of 之后的类型)的集合始终兼容。

您的假设是正确的:通常,两个集合都转换为具有共同范围的临时值,然后比较临时值。转换是通过调用 fpc_varset_load.

完成的

如果您对更多细节感兴趣,决定如何转换集合的代码位于 nadd.pas(参见 1)第 1593 行开始。