[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC] A new mechanism to access the active field of unions
From: |
Jose E. Marchesi |
Subject: |
Re: [RFC] A new mechanism to access the active field of unions |
Date: |
Thu, 04 Mar 2021 21:01:51 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) |
>> The current approach to deal with unions using exception is not elegant.
>>
>> ```poke
>> try u.field1 = 1;
>> catch if E_elem {};
>> ```
>>
>> These are my initial ideas regarding this problem:
>>
>>
>> === Option 1. Overloading of `isa` operator
>>
>> ```poke
>> if (u isa TargetType) {
>> }
>> ```
>>
>> But overloading `isa` operator will change the current behavior:
>>
>> ```poke
>> type U1 =
>> union
>> {
>> int i;
>> };
>> var u1 = U1 {};
>>
>> // current behavior
>> assert (u1 isa U);
>> assert (!(u1 isa int));
>> ```
>
> The overloading of the `isa' operator would get a value at the left side
> and an identifier at the right side, not a type. Like in:
>
> type U1 =
> union
> {
> int i : i > 0;
> long l;
> };
>
> var u1 = U1 {};
>
> (poke) u1 isa i
> 1
> (poke) u1 isa l
> 0
> (poke) u1 isa quux
> error: invalid member `quux'
>
>> === Option 2. A new operator (e.g., `holds`)
>>
>> ```poke
>> assert (u1 isa U);
>> assert (u1 holds int);
>> ```
>>
>> But there's an issue here, `union`s, almost always are not defined as a type.
>
> This would be resolved if the right operator of `holds' is a field
> name/identifier. But then it is just like Option 1 with a different
> name for the operator.
>
>> === Option 3. Adding more reflection (introspection) facilities to unions
>>
>> ```poke
>> if (frm.u'holds("text")) {
>> /* ... */
>> } else if (frm.u'holds("frame_data")) {
>> /* ... */
>> }
>>
>> assert (frm.u'fields in ["text", "frame_data"]);
>> ```
>
> This could also be achieved by having isa/hold to get a string at the
> right side instead of an identifier:
>
>
> frm.u isa "text"
>
> So, to summarize:
>
>
> VAL isa TYPE
>
> Checks whether VAL is of type TYPE.
> This already works.
>
> VAL isa IDENTIFIER
>
> Checks whether VAL is an union value _and_ has a field named
> IDENTIFIER.
>
> VAL isa STR
>
> Checks whether VAL is an union value _and_ has a field named STR.
>
> If reusing `isa' like that is confusing, we can come with a new syntax
> for the second and third usages, like:
>
> VAL?.IDENTIFIER
> VAL?."STR"
>
> or something like that...
Gotta say that my favorite option for now is to overload `isa'.
It may nicely push programmers to use good names for the union
alternatives, i.e. to identify the field name with the tag of the union
:)
Re: [RFC] A new mechanism to access the active field of unions, Dan Čermák, 2021/03/05