rfc:arrow_functions

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
rfc:arrow_functions [2017/01/21 19:33] – Version 1.3 levimrfc:arrow_functions [2017/09/22 13:28] – external edit 127.0.0.1
Line 4: Line 4:
   * Author: Levi Morrison <levim@php.net>   * Author: Levi Morrison <levim@php.net>
   * Author: Bob Weinand <bwoebi@php.net>   * Author: Bob Weinand <bwoebi@php.net>
-  * Status: Draft+  * Status: Under Discussion
   * First Published at: http://wiki.php.net/rfc/arrow_functions   * First Published at: http://wiki.php.net/rfc/arrow_functions
  
Line 21: Line 21:
  
 <PHP>function array_values_from_keys($arr, $keys) { <PHP>function array_values_from_keys($arr, $keys) {
-    return array_map(fn ($x) => $arr[$x], $keys);+    return array_map(fn($x) => $arr[$x], $keys);
 }</PHP> }</PHP>
  
Line 34: Line 34:
  
 <PHP> <PHP>
-fn (parameter_list) => expr+fn(parameter_list) => expr
 </PHP> </PHP>
  
Line 40: Line 40:
  
 <PHP> <PHP>
-$mul2 = fn ($x) => $x * 2;+$mul2 = fn($x) => $x * 2;
  
 $mul2(3); // evaluates to 6 $mul2(3); // evaluates to 6
Line 51: Line 51:
 $y = 1; $y = 1;
  
-$versionA = fn ($x) => $x + $y;+$versionA = fn($x) => $x + $y;
  
 $versionB = function ($x) use ($y) { $versionB = function ($x) use ($y) {
Line 63: Line 63:
 ==== Type Declarations ==== ==== Type Declarations ====
 This RFC does support type declarations for parameters and return types. This issue was noted multiple times on the mailing list during the short closures RFC as something that bothered voters. Therefore this RFC permits them but the authors discourage their general use in arrow functions. This RFC does support type declarations for parameters and return types. This issue was noted multiple times on the mailing list during the short closures RFC as something that bothered voters. Therefore this RFC permits them but the authors discourage their general use in arrow functions.
 +
 +Here are some examples to show the syntax:
 +
 +<PHP>
 +fn (array $x) => $x
 +fn (): int => 42
 +</PHP>
 +
 +==== References ====
 +Parameters and return values can be passed/returned by reference. As mentioned elsewhere, implicitly bound variables will be bound //by value// and not //by reference//. References go in the usual places:
 +
 +<PHP>
 +fn &(array &$xs) => $xs
 +</PHP>
 +
 +==== Static Arrow Functions ====
 +The implementation currently supports static closures, for example <php>static fn($x) => static::get($x)</php>. While supported it is uncertain whether it should be included in the final version. Having the implementation support it allows testers to determine usefulness and value.
  
 ==== Ambiguities ==== ==== Ambiguities ====
 Arrow functions have no ambiguities, including array key definitions and yield expressions that provide a key. The ''fn'' prefix removes the ambiguities. Arrow functions have no ambiguities, including array key definitions and yield expressions that provide a key. The ''fn'' prefix removes the ambiguities.
- 
 ==== Backward Incompatible Changes ==== ==== Backward Incompatible Changes ====
-Unfortunately the ''fn'' keyword must be a full keyword and not just a reserved function name; this is to break the ambiguities with ''<nowoki>=></nowiki>'' for array and yield keys.+Unfortunately the ''fn'' keyword must be a full keyword and not just a reserved function name; this is to break the ambiguities with ''<nowiki>=></nowiki>'' for array and yield keys
 + 
 +Ilija Tovilo analyzed the top 1,000 PHP repositories on GitHub to find usages of ''fn''. [[https://gist.github.com/morrisonlevi/473a7e0cb6e59c830224b1c71b8da28c|The gist]] provides more information, but the rough findings are that all known existing usages of ''fn'' are in tests except one case where it is a namespace segment.
  
 ==== Patches and Tests ==== ==== Patches and Tests ====
Line 85: Line 103:
 ----- -----
  
-==== Examples ==== +===== Examples =====
- +
-=== Snippets ===+
 Taken from [[https://github.com/silexphp/Pimple/blob/62b5d317a83b02eea42b5b785b62a29fba458bcf/src/Pimple/Container.php#L242-L244|silexphp/Pimple]]: Taken from [[https://github.com/silexphp/Pimple/blob/62b5d317a83b02eea42b5b785b62a29fba458bcf/src/Pimple/Container.php#L242-L244|silexphp/Pimple]]:
  
Line 95: Line 111:
  
 // with arrow function: // with arrow function:
-$extended = fn ($c) => $callable($factory($c), $c);</PHP>+$extended = fn($c) => $callable($factory($c), $c);</PHP>
  
 This reduces the amount of boilerplate from 44 characters down to 8. This reduces the amount of boilerplate from 44 characters down to 8.
Line 108: Line 124:
  
 // with arrow function // with arrow function
-$this->existingSchemaPaths = array_filter($paths, fn ($v) => in_array($v, $names));</PHP>+$this->existingSchemaPaths = array_filter($paths, fn($v) => in_array($v, $names));</PHP>
  
 This reduces the amount of boilerplate from 31 characters down to 8. This reduces the amount of boilerplate from 31 characters down to 8.
Line 124: Line 140:
 // with arrow function: // with arrow function:
 function complement(callable $f) { function complement(callable $f) {
-    return fn (... $args) => !$f(... $args);+    return fn(... $args) => !$f(... $args);
 }</PHP> }</PHP>
  
-=== Longer Examples ===+-----
  
-The following examples were given to me by [[https://gist.github.com/tpunt/b4f9bf30f43b9e148b73ce18245ab472|tpunt]]:+The following example was given to me by [[https://gist.github.com/tpunt/b4f9bf30f43b9e148b73ce18245ab472|tpunt]]:
  
 <PHP>$result = Collection::from([1, 2]) <PHP>$result = Collection::from([1, 2])
Line 143: Line 159:
 // with arrow functions: // with arrow functions:
 $result = Collection::from([1, 2]) $result = Collection::from([1, 2])
-    ->map(fn ($v) => $v * 2) +    ->map(fn($v) => $v * 2) 
-    ->reduce(fn ($tmp, $v) => $tmp + $v, 0);+    ->reduce(fn($tmp, $v) => $tmp + $v, 0);
  
 echo $result; //6 echo $result; //6
 </PHP> </PHP>
  
-===== Future Scope ===== +===== Future ScopeMulti-Statement Bodies =====
- +
-==== Multi-Statement Bodies ====+
 Some languages permit multi-statement closures with a syntax like: Some languages permit multi-statement closures with a syntax like:
  
rfc/arrow_functions.txt · Last modified: 2018/06/28 14:35 by levim