Re: Arrow function expressions in PHP

From: Date: Sat, 26 Sep 2015 17:07:55 +0000
Subject: Re: Arrow function expressions in PHP
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-88516@lists.php.net to get a copy of this message
On 26/09/2015 17:17, Levi Morrison wrote:
What concerns do you have about fn($x) => $x * 2 or `function($x) => $x * 2`? I will be writing a proper RFC later but I wanted to get discussion going now.
If a keyword is required next to the parameters, having the => as a separate token looks a bit weird. It no longer matches other languages, so how about thinking a bit further outside the box? One of the random thoughts that popped into my head during the previous discussion was to base the syntax on the C for-loop, which would also give a place for bound variables without the "use" keyword. e.g. your example could become fn($x;; $x * 2) I picked "lambda" as the keyword before, and gave these examples: # lambda(params; bound vars; expression) $double = lambda($a;; 2*$a) $x=3; $triple = lambda($a; $x; $x * $a) function sumEventScores($events, $scores) {
    $types = array_map(lambda($event;; $event['type']), $events);
    return array_reduce($types, lambda($sum, $type; $scores; $sum + $scores[$type]));
} Adding in the type information, we'd get this: lambda(int $sum, string $type; $scores; $sum + $scores[$type]) # or with fn() if you prefer: fn(int $sum, string $type; $scores; $sum + $scores[$type]) If return typehints are also required, I'm not sure where they'd best be placed. If they're outside the parens, they end up after the expression, which might look odd: fn(int $sum, string $type; $scores; $sum + $scores[$type]): int A few other possibilities: fn(int $sum, string $type; $scores; $sum + $scores[$type]; int) fn(int $sum, string $type: int; $scores; $sum + $scores[$type]) fn:int(int $sum, string $type; $scores; $sum + $scores[$type]) All of this assumes that the shorthand is only available for simple expressions, not function bodies, but it seems a bit rendundant to allow both of these: function($x) { foo(); bar(); baz(); } fn($x) => { foo(); bar(); baz(); } And only marginally more useful if variables are auto-captured, with all the downsides of that which have already been raised: function($x) use ($y) { foo($x); bar($x, $y); } fn($x) => { foo($x); bar($x, $y); } Regards, -- Rowan Collins [IMSoP]

« previous php.internals (#88516) next »