Re: Fwd: Re[2]: [PHP-DEV] PHP 8.1 enum const expressions problem
| From: | Rowan Tommins | Date: | Fri, 30 Jul 2021 13:45:34 +0000 |
| Subject: | Re: Fwd: Re[2]: [PHP-DEV] PHP 8.1 enum const expressions problem | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-115612@lists.php.net to get a copy of this message | ||
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]