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
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php