On Sat, Apr 11, 2020, at 7:16 PM, Ilija Tovilo wrote:
> Hi internals
> 
> I'd like to announce the match expression RFC that replaces the switch
> expression RFC I announced a few weeks ago.
> New: https://wiki.php.net/rfc/match_expression
> Old: https://wiki.php.net/rfc/switch_expression
> 
> Due to the feedback I decided to take the RFC in a slightly different
> direction. The main objections were:
> 
> 1. It didn't behave like the traditional switch so it shouldn't use
> the switch keyword
> 2. It didn't fix type coercion
> 3. The RFC was poorly structured
> 
> In hindsight I understand why I had a hard time writing the RFC. I
> tried making a case against the switch statement while really not
> addressing the switch statement at all. The new RFC proposes a match
> expression that fixes all the objections raised against the switch
> statement. Additionally, match arms can now contain statement lists
> which allows you to use the match expression anywhere the switch
> statement would have been used previously.
> 
> While some people have suggested statement lists aren't necessary I
> don't think it makes sense to raise objections against the switch
> statement without offering an alternative.
> 
> I also experimented with pattern matching but decided against it. The
> exact reason is described in the RFC.
> 
> I'm now confident this is the right approach. I hope you will be
> happier with this proposal.
> 
> Happy Easter!

This is a substantial improvement over the previous RFC, thank you!

1) The use of => is fine with me.  I'm not bothered by it, but I'm also open to 
other options like : if there's a strong consensus otherwise.

2) I am also still against block statements in the right-hand side, largely for 
the same reasons as Rowan.  They're unnecessary and lead to confusion.  In my 
mind, match expressions are more like a multi-branch ternary than a switch 
statement.

When I say unnecessary, I mean that very literally.  Because it can take any 
expression, that means it can simply execute a pre-defined function or 
anonymous function.

function b() {
  // Something multi-line and complicated.
}

$c = function ($x) {
  // Something multi-line and complicated.
};

match ($x) {
  1 => 'A',
  2 => b(),
  3 => $c($x),
};

That not only alleviates the need to support multi-line blocks, it keeps the 
match statement itself clearer to understand at-a-glance, and encourages the 
definition of named, testable, small blocks of code (ie, functions whether 
anonymous or not), which is a net win on its own.  The overall effect is the 
same.

And if you really, really need to inline the block for some reason, this is 
ugly but syntactically valid:

match ($x) {
  1 => 'A',
  2 => b(),
  3 => function() use ($whatever) {
    // Something multi-line and complicated.
  }(),
};

(Incidentally, the same "factor complex expressions out to a function an 
everyone is better off" applies to the left hand side, too.  That's a good 
thing.)

I would strongly recommend removing the block statement support, as it just 
muddies the water.

3) I'm fine with match() always being strict comparison, regardless of the type 
mode.  However, it should probably be made more explicit in the RFC that it is 
unaffected by the type mode.

4) Possible addition: Make the match input optional, defaulting to "true".  
That is:

match (true) {
  $x < 5 => 'A',
  $x > 10 => 'B',
  $x ==7 => 'C',
  default => 'D',
}

Can be shortened to:

match {
  $x < 5 => 'A',
  $x > 10 => 'B',
  $x ==7 => 'C',
  default => 'D',
}

Since it's an expression it still has all the values available from the scope, 
so it's just as capable and saves a little typing in that case.

--Larry Garfield

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

Reply via email to