简体   繁体   中英

ISO Pascal record variants without a field name

I'm slightly confused trying to figure a section of ISO Pascal.

The grammar allows you to do this:

type RPoint = Record
  Case Boolean of
    False : (X,Y,Z : Real);
    True : (R,theta,phi : Real);
end;

To construct it, you do:

var p: RPoint;
begin
  p.x := 1;
end.

There's one part I don't understand: what's the purpose of the Case Boolean part? I understand that you can do case MyVal: Boolean ; then MyVal becomes the field selector. However, what is the purpose when there is no field selector, just a type?

In addition, the standard says:

With each variant-part shall be associated a type designated the selector-type possessed by the variant-part . If the variant-selector of the variant-part contains a tag-field, or if the case-constant- list of each variant of the variant-part contains only one case-constant, then the selector-type shall be denoted by the tag-type, and each variant of the variant-part shall be associated with those values specified by the selector-type denoted by the case-constants of the case-constant-list of the variant . Otherwise, the selector-type possessed by the variant-part shall be a new ordinal-type that is constructed to possess exactly one value for each variant of the variant-part, and no others, and each such variant shall be associated with a distinct value of that type.

I don't quite understand what the selector-type is and why it would be a new ordinal-type . Wouldn't the selector-type just be the type like in case Boolean of ? And what does each case-constant-list having only one case-constant have to do with it?

Here your variant record has two possible 'personalities'. Boolean is a type with two possible values. So, it seemed like a logical choice. But, it doesn't have to be Boolean.

You could have used some other ordinal type such as Integer or Byte to get the same effect. For example:

type RPoint = Record
  Case Byte of
    0: (X,Y,Z : Real);
    1: (R,theta,phi : Real);
end;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM