Re: [RFC] switch expression
| From: | Dennis Birkholz | Date: | Wed, 25 Mar 2020 16:06:33 +0000 |
| Subject: | Re: [RFC] switch expression | ||
| References: | 1 2 3 4 5 6 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-109297@lists.php.net to get a copy of this message | ||
Hello together,
Am 25.03.20 um 16:46 schrieb Larry Garfield:
> On Wed, Mar 25, 2020, at 10:29 AM, Ilija Tovilo wrote:
>> Thanks for your feedback, Larry!
>>
>>> One possible improvement to either version is allowing an expression on the left side.
>>> That is, rather than doing an equality match, do a boolean match.
>>
>> This is how Rust does it:
>>
>> ```rust
>> let x = match ... {
>> Some(y) if y < 5 => ...
>> }
>> ```
>>
>> In other words, you can add an additional guard to each case that
>> excepts any expression. We don't really benefit a lot from that since
>> we don't have pattern matching. I don't think this would add any
>> significant benefit over:
>>
>> ```php
>> $x = true switch {
>> $x !== null && $x < 5 => ...
>> }
>> ```
>
> Good point, I'd forgotten about that potential trick. So as long as an expression is
> allowed on the left, rather than just a literal, which is then == compared against the provided
> value, that should be "good enough" for most use cases.
>
> The implementation should include some tests to make sure that works properly, but I'm
> happy with the resulting syntax.
>
> So then the net result is:
>
> $var = switch($val) {
> case expr1 => expr2;
> }
>
> Where $val gets compared against the result of each expr1, and if true then $var is set to
> expr2.
on the first glance this all looks nice but you actually created
something more like an if-expression that uses switch as a keyword
because you stripped switch of some of its major features:
- you compare the given value to possible cases -> you compare
expressions to true
- you can fall through to other cases without break
- what about the default case?
What about the following if-expression-syntax:
$var = if ($x > 0) { return 1; }
elseif ($x < 0) { return -1; }
else { return 0; }
Maybe this is more in line of what you want to do with your switch
expression?
Greets
Dennis