> On Oct 15, 2019, at 11:33 PM, Michał Brzuchalski 
> <michal.brzuchal...@gmail.com> wrote:
> 
> I have an RFC in draft for that and planning to finish it soon together
> with some syntax optimisations - you can see it at
> https://wiki.php.net/rfc/switch-expression-and-statement-improvement
> 
> Cheers,
> Michał Brzuchalski

In an earlier message I said I would return to comment on some concerns I have 
with the RFC.

In general, I would appreciate having a way to express a "switch" in an 
expression much like how you can express an "if" with the ternary operator. 
However, the specifics of your suggestion give me pause. 

Also, some of my concerns are contradictory to each other which I will admit in 
advance.

1. I am a strong believer in language design that facilitates refactoring. But 
your syntax would make refactoring from an existing switch harder than it would 
need to be if the syntax more closely matched the existing switch.  

In your proposal you replace colons (:) with fat arrows (=>) which has no 
perceptible benefit, at least not for me:

$say = switch (date("w")):string {
   case 0 => "weekend!";
   case 1, 2, 3, 4, 5 => "weekday :(";
   case 6 => "weekend!";
};

The same logic in today's PHP:

switch (date("w")) {
   case 0: 
      $say = "weekend!";
      break
   case 1, 2, 3, 4, 5: 
          $say = "weekday :(";
      break
   case 6:      
     $say = "weekend!";
};

It would be easier to manually refactor if mostly the same syntax was used, 
e.g. with colons (") vs. fat arrows (=>):

$say = switch (date("w")):string {
   case 0: "weekend!";
   case 1, 2, 3, 4, 5: "weekday :(";
   case 6: "weekend!";
};

So if I had a vote I would vote likely against your RFC with the fat arrows but 
for it if you changed it to use colons instead.

2. However, I find the above more verbose than would be ideal, and I would like 
an optional equivalent of the ternary operator, e.g. both a verbose option and 
a terse option.  I said optional above because — unlike the stated preferences 
of others here on this list — I celebrate having multiple ways to accomplish 
the same task because some approaches fit a given use-case better than other 
approaches.

What might a terse option look like? Maybe this, although I might have missed 
conflicts to the existing language:

$say = date("w"):string ???  
   0: "weekend!"; 
   1, 2, 3, 4, 5: "weekday; :("; 
   6: "weekend!";
   $default;

I will say, one huge benefit to an inline switch would be allowing for switch 
logic without requiring a `break` (or an explicit `fallthrough`) and without 
any backward compatibility concerns, at least for some use-cases.

-Mike



Reply via email to