2016-02-28 44 views
1

以下代码取自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,并从ab 2米的临时对象set of 0..100,然后比较这些做的临时)。

回答

2

将整数设置为基本类型(set of之后的类型)始终是兼容的。

你的假设是正确的:一般来说,这两个集合都转换为具有常用范围的临时对象,然后比较临时对象。转换通过致电fpc_varset_load完成。

如果您有兴趣了解更多的细节,这决定如何将集转换的代码,位于nadd.pas(见1)开始行1593

+0

感谢。由于我正在编写我自己的编译器,所以我宁愿不太看别人的编译器代码。 –

+1

如果你正在编写一个编译器,你可能需要一个编译器处理语言的书面规范。在Pascal的情况下,您可能会考虑ISO/IEC 7185(也称为标准帕斯卡)。 – Stuart

+0

@Stuart:是的,但是阅读规范实际上并不能解释不同集合类型会发生什么(至少不是我阅读规范 - 而上述测试不是我目前所用的“iso7185pat.pas”的一部分运行[并通过,除了从函数跳转到“主”])。在我开始减少不必要的大集合之前,这在我的编译器中没有问题 - 如果所有集合的长度都是512或1024,无论内容如何,​​这都不是问题。 –