MODULE TSubrange; // Subranges keep their base type: ['A'..'Z'] is character and // [red..green] is that enumeration, so base-typed values assign to // and compare with them. MIN/MAX of a SET yields its base type, and // FOR accepts any ordinal control variable. Exit 42. TYPE Up = ['A'..'Z']; TYPE Colour = (red, blue, green); TYPE Warm = [red..green]; TYPE CSet = SET OF Colour; VAR ExitCode : INTEGER; VAR u : Up; VAR c : Colour; VAR w : Warm; VAR s : CSet; VAR i : INTEGER; BEGIN u := 'H'; c := blue; w := blue; i := 0; IF (u = 'H') AND (c = w) THEN i := i + 1 END; IF (c >= red) AND (c <= green) THEN i := i + 1 END; s := CSet{red..green}; IF MIN(CSet) = red THEN i := i + 10 END; IF MAX(CSet) = green THEN i := i + 10 END; FOR c := red TO green DO i := i + 1 END; ExitCode := i + 17 END TSubrange.