Hi Kosit,

On Sun, 20 Oct 2019 at 16:20, Kosit Supanyo <webdevxp....@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]

Reply via email to