Re: [RFC] [Discussion] Short Closures

From: Date: Tue, 01 Sep 2015 14:21:25 +0000
Subject: Re: [RFC] [Discussion] Short Closures
References: 1 2 3 4 5 6 7 8 9  Groups: php.internals 
Request: Send a blank email to internals+get-87994@lists.php.net to get a copy of this message
Anthony Ferrara wrote on 01/09/2015 06:53:
function partial(callable $cb) {
     return $left ~> $right ~> $cb($left, $right);
}
The thing that is most unreadable to me in this is the associativity. Someone from, say, a Haskell background might be used to mentally grouping X -> Y -> Z into a series of steps but to an untrained eye it looks almost like there's a list of terms with ~> as the separator. As I understand it, an expanded form would be: return ($left) ~> { return ($right) ~> { return $cb($left, $right) } }; ...which is a bit easier to mentally group, but not much prettier than current PHP syntax. What about something a bit more "enclosed" but still short. A for-loop-style construct occured to me: # lambda(params; expression) lambda($a, $b; $a * $b) lambda($x; { while(foo()) { $x ++; } return $x; }) The curly braces don't look very natural in that last example, but I'm not sure what else to use. Maybe just use the existing function() syntax if you want a block rather than an expression? A nice expansion of this would be to have an explicit use clause without any extra keywords: # lambda(params; bound vars; expression) $double = lambda($a;; 2*$a) $x=3; $triple = lambda($a; $x; $x * $a) Taking one of the RFC's examples: function sumEventScores($events, $scores) {
    $types = array_map(lambda($event;; $event['type']), $events);
    return array_reduce($types, lambda($sum, $type; $scores; $sum + $scores[$type]));
} The next example benefits less if we allow only expressions, but you could still write this: function reduce(callable $fn) {
    return lambda($initial; $fn;
        function($input) use ($fn, $initial) {
            $accumulator = $initial;
            foreach ($input as $value) {
                $accumulator = $fn($accumulator, $value);
            }
            return $accumulator;
        }
    );
} I'll leave it to others to judge if this is better or worse than the current proposal, just playing with ideas... Regards, Rowan Collins -- [IMSoP]

« previous php.internals (#87994) next »