On 13 April 2020 09:38:10 BST, Ilija Tovilo <tovilo.il...@gmail.com> wrote: >It's described in the RFC: > >//> Fatal error: Match expressions that utilize the result value can't >contain statement lists
Thanks, I missed that. Reasonably clear, I guess, although I imagine there'll be questions on Stack Overflow asking what a "statement list" is. >> So this would be valid PHP? >> >> $x = match($y) { 1 => "Hello", 2 => "Goodbye" } echo $y; > >No. A semicolon is needed. Here the semicolon belongs to the >assignment, not the match. ... >The only case where expression statement doesn't require a semicolon is >here: > >* Expression statement <- Doesn't require a semicolon > * match Right, so I go back to my earlier point that there are basically two forms of match proposed: - one where you can use it anywhere an expression is expected, with no statement blocks - one which can be used as a standalone statement, which can contain statement blocks, and which doesn't need a trailing semicolon >> I think needing to add a special case to the grammar is a sign that >the >> proposed syntax doesn't fit well with the rest of the language. > >I find it odd that people keep referring to Rust but apparently have >no clue how it works. This is precisely what they do. > >https://doc.rust-lang.org/reference/statements.html#expression-statements I didn't mention Rust, and am fully aware that I don't know how its syntax works. What I said was that the proposed syntax doesn't fit into PHP easily. Two things stand out to me following that link: Firstly, block expressions are a foundational part of the Rust language, not a special case used in only one place. They're used as the basis for everything from if statements to async blocks, all of which evaluate to a value. That's a really neat design feature, but not something that exists in PHP. It also makes the semicolon rule somewhat more natural: it makes *all* the control flow blocks in Rust feel more natural to developers coming from other languages. It's not an ad hoc rule for one expression, it's a general rule across the language. Secondly, the page you linked calls out an ambiguity caused by omitting the semicolon, which would apply equally in PHP: match($x) { 1 => ['foo', 'bar'] } [0]; It then explains the important restriction of only omitting the semicolon if the result is void/null rather than a concrete value. An equivalent in PHP would be to only allow omitting the semicolon if every arm of the match is a statement list, further distinguishing the expression and statement forms. > I think this RFC >satisfies your needs. It has some extra parts you don't need, and >that's fine. Just to be clear, that may be fine with you, but if I had a vote, I would probably vote no to the current proposal, because I actively dislike the proposed syntax and semantics of statement blocks. They "poison the barrel" for me. That's a real shame, because I really like the core of the proposal. Regards, -- Rowan Tommins [IMSoP] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php