Re: 'switch-expression' and the 'type guard' unary operator demo

From: Date: Mon, 21 Oct 2019 14:36:27 +0000
Subject: Re: 'switch-expression' and the 'type guard' unary operator demo
References: 1 2 3 4  Groups: php.internals 
Request: Send a blank email to internals+get-107598@lists.php.net to get a copy of this message
Hi Rowan I'm not sure <foo> is the right syntax for type guards, but it's possible > we'd want a different syntax for new switch/match functionality anyway. I've decided to change the syntax to (: foo). It may look weird at frist but it is able explain why I think this syntax is more appropriate. Because PHP already uses : to specify return type of functions so (: foo) syntax can be seen as a way to specifying return type of expressions. And it can be put into the same visual category of cast operators. $a = (int)$b; // filter $c = (: int)$d; // guard This syntax choice may not satisfy everyone's taste but at least it is explainable. So now there's 2 choices <foo> and (: foo). And more choices are welcome from anyone who think type guard should be a new feature. For instance, using a placeholder for the value being tested, like $$ (a > common > choice in other languages is _, but that's a valid and commonly used > function name): About that, I'm working on a different approach which I would like to show you after I finished the next demo :) Regards On Mon, Oct 21, 2019 at 8:52 PM Rowan Tommins <rowan.collins@gmail.com> wrote: > Hi Kosit, > > On Sun, 20 Oct 2019 at 16:20, Kosit Supanyo <webdevxp.com@gmail.com> > wrote: > > > You can recognize the difference of those by looking for > > => right? But > > the parser generator (bison) cannot do that in LR mode (it maybe can in > GLR > > mode but I'm sure that would be unacceptable due to performance > losses/more > > memory usage). So workarounds have to be used. I did it by simply return > > different tokens from the lexer base on previous token before > > switch. > >> > >> > > > Thanks for clarifying, I thought it might be something like that. > > > > > > * Different comparisons applied to the same variable/expression, e.g. > >> match($user->getScore()) { case <0 => foo(), case >100 => bar(), > >> default > >> => baz() } > > > > > > I'd thought about that feature too. But since I also introduced type > guard > > operator which uses < token it would have parser > > conflicts and simple > > workarounds cannot apply. > > > > > > I'm not sure <foo> is the right syntax for type guards, but it's possible > we'd want a different syntax for new switch/match functionality anyway. For > instance, using a placeholder for the value being tested, like $$ (a common > choice in other languages is _, but that's a valid and commonly used > function name): > > match ( $user->getScore() ) { > $$ < 0, $$ > 100 => foo(), > $$ < 10 => bar(), > default => baz() > } > > You could also allow the placeholder in the opening clause to define the > same operation for each case: > > match ( $user->getScore() < $$ ) { > 0, default => foo(), > 10 => bar(), > 100 => baz() > } > > > Regards, > -- > Rowan Tommins > [IMSoP] >

« previous php.internals (#107598) next »