>Пятница, 30 июля 2021, 16:45 +03:00 от Rowan Tommins <rowan.coll...@gmail.com>:
> 
>On 30/07/2021 13:20, Kirill Nesmeyanov wrote:
>> 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;
>
>If you are performing arithmetic on a value, that value is not of an
>enum type, or at least not in the way the current feature defines "enum".
>
>If you write an enum for days of the week, you might give them integer
>values, such that "Day::MONDAY->value === 1" and "Day::SUNDAY->value ===
>7". However, expressions such as "Day::SATURDAY + Day::SUNDAY"  and
>"Day::MONDAY * Day::TUESDAY" are clearly meaningless.
>
>At a stretch, a language with operator overloading might define
>"Day::MONDAY + 1" to return "Day::TUESDAY", and "Day::MONDAY + 10" to
>either error or wrap around to "Day::THURSDAY"; but PHP has covered that
>use case by allowing methods, e.g. "Day::MONDAY->advanceBy(10)", which
>is more flexible and arguably more expressive.
>
>On the other hand, the expression "$weekend = Day::SATURDAY |
>Day::SUNDAY" seems reasonable; but we don't need the result to be an
>integer - it would have no meaning on its own - we just need to be able
>to ask things like "is $today in $weekend?" Returning some kind of
>EnumSet object means we retain the type information, and can keep our
>values of 1 to 7 (or have no values at all) rather than having to use
>powers of 2.
>
>Regards,
>
>--
>Rowan Tommins
>[IMSoP]
>
>--
>PHP Internals - PHP Runtime Development Mailing List
>To unsubscribe, visit:  https://www.php.net/unsub.php
 
1) What about this example?
 
enum ErrorGroup: int
{
    case NOTICE = 0;
    case WARNING = 10;
    case ERROR = 20;
}
 
enum ErrorCode: int
{
    case UNKNOWN = 0;
    
    case A = ErrorGroup::NOTICE + 1;
    case B = ErrorGroup::NOTICE + 2;
    case С = ErrorGroup::NOTICE + 3;
    case D = ErrorGroup::WARNING + 1;
    case E = ErrorGroup::ERROR + 1;
}
 
The same applies to, for example, designing Http statuses (However, since they 
are pre-specified, this does not make sense).
 
2) OR: As an example from real life, I can show this pseudo-enum:  
https://github.com/SerafimArts/ffi-sdl/blob/master/src/Kernel/Video/PixelFormat.php
  
 
How is this supposed to work in the future? Bit masks are just one case of many 
others.
 
--
Kirill Nesmeyanov
 

Reply via email to