Re[2]: Fwd: Re[2]: [PHP-DEV] PHP 8.1 enum con st expressions problem
| From: | Kirill Nesmeyanov | Date: | Fri, 30 Jul 2021 12:20:10 +0000 |
| Subject: | Re[2]: Fwd: Re[2]: [PHP-DEV] PHP 8.1 enum con st expressions problem | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-115611@lists.php.net to get a copy of this message | ||
>Пятница, 30 июля 2021, 13:46 +03:00 от Marc Bennewitz <marc@mabe.berlin>:
>
>
>On 30.07.21 02:01, Кирилл Несмеянов wrote:
>> Yes, I saw this short description in your RFC (
>> https://wiki.php.net/rfc/enumerations ) about «enum sets».
>> However, I do not quite understand why we can not now add a cast to scalars (string and int) and
>> math expressions, which would solve this problem? This behavior has already been implemented for
>> GMP objects.
>>
>> $mask = gmp_init(0b0001) | gmp_init(0b0010); // object(GMP) { num = 3; }
>> echo $mask; // 3
>>
>> $mask = $mask + 1; // object(GMP) { num = 4; }
>> $mask instanceof \GMP; // true
>>
>> I mean, for such cases, we can create a new "virtual enum case" containing a new
>> value instead special «EnumSetCase».
>>
>> enum Some: int
>> {
>> case A = 0b0001;
>> case B = 0b0010;
>> }
>>
>> var_dump(Some::A | Some::B); // enum(Some::@anonymous) { value = 3; }
>>
>> I don’t think that it is necessary to consider the «enum sets» as a separate case,
>> cause addition is also a fairly popular case:
>>
>> case LAST = self::B + 1;
>>
>> Like any other mathematical operations.
>I think you missing something
>
>Consider this example:
>
>enum Some: int
>{
> case A = 0b0001;
> case B = 0b0010;
> case C = 0b0011;
>}
>
>var_dump(Some::B | Some::C)
>
>This should result in a set of B|C but with your logic it's the same as
>just C.
>
>and it also needs to work with strings:
>
>enum Some: string
>{
> case A = 'a';
> case B = 'b';
> case C = 'c';
>}
>
>This is where enum sets comes into play.
>
>Without having PHP internals C knowledge I think it should be possible
>to introduce an EnumSet which internally handles a bit array where each
>bit is pointing to the position (ordinal) of an enum case but I don't
>think the ordinal position is guarantied to be stable over
>processes/versions so this would not directly by serializable nor do we
>have generics to define an enum set of a specific type (ala EnumSet<Some>).
>
>Marc
>
>--
>PHP Internals - PHP Runtime Development Mailing List
>To unsubscribe, visit: https://www.php.net/unsub.php
Yes, that's a good example. I agree.
But in addition to bit-masks, there are also at least cases of addition and subtraction (the most
popular). Can't we adapt all math expressions existing in nature to specific cases, thereby
building our own pseudo-AST?
(Some::A + Some::B) * Some::C | Some::D;
EnumSet of
- a: Some::D
- b: EnumMul of
- a: Some::C
- b: EnumSum of
- a: Some::A
- b: Some::B
Imho, this is a hellish overcomplication. Isnt it?
--
Kirill Nesmeyanov