On 25.03.2020 at 17:06, Dennis Birkholz wrote:
> 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?

Or maybe even

  $var = $x > 0 ? 1
       :($x < 0 ? -1
       : 0);

Yes, the required parentheses are ugly, but in my opinion, this is still
better than a new if or switch(true) expression construct.

--
Christoph M. Becker

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to