rfc:short_closures
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
rfc:short_closures [2015/05/01 18:53] – bwoebi | rfc:short_closures [2015/10/03 10:45] – bwoebi | ||
---|---|---|---|
Line 3: | Line 3: | ||
* Date: 2015-05-01 | * Date: 2015-05-01 | ||
* Author: Bob Weinand, bobwei9@hotmail.com | * Author: Bob Weinand, bobwei9@hotmail.com | ||
- | * Status: | + | * Status: |
* First Published at: http:// | * First Published at: http:// | ||
Line 57: | Line 57: | ||
</ | </ | ||
- | Concrete syntax is (~> is right associative with lowest possible | + | In case of no parameters, an empty parenthesis pair is needed. |
+ | <code php> | ||
+ | ~> 2 * 3; // Unexpected T_TILDED_ARROW | ||
+ | () ~> 2 * 3; // correct, will return 6 when called | ||
+ | </ | ||
+ | |||
+ | Concrete syntax is (~> is right associative with lowest possible | ||
< | < | ||
( parameter_list ) ~> expression | ( parameter_list ) ~> expression | ||
Line 72: | Line 78: | ||
Also, parameter_list does //not// include default values nor type hints. See also the 'Type Hints and Return Types' section at the bottom. | Also, parameter_list does //not// include default values nor type hints. See also the 'Type Hints and Return Types' section at the bottom. | ||
+ | |||
+ | // | ||
+ | This RFC stance is that chained short Closures followed by a full Closure would look quite weird: '' | ||
+ | |||
+ | // | ||
+ | While it might appear not consistent, with any other number of parameters, a lot of languages having extra short Closures allow this. Also, Closures with just one parameter are relatively common, so this RFC author thinks it is worth supporting that. | ||
==== Variable binding ==== | ==== Variable binding ==== | ||
Line 170: | Line 182: | ||
sumEventScores($events, | sumEventScores($events, | ||
+ | </ | ||
+ | |||
+ | ==== Lazy evaluation ==== | ||
+ | It may be necessary to have code only evaluated under specific conditions, like debugging code: | ||
+ | <code php> | ||
+ | function runDebug(callable $func) { | ||
+ | /* only run under debug situations, but don't let it interrupt program flow, just log it */ | ||
+ | if (DEBUG) { | ||
+ | try { | ||
+ | $func(); | ||
+ | } catch (Exception $e) { /*... */ } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | $myFile = "/ | ||
+ | |||
+ | /* Old code */ | ||
+ | runDebug(function() use ($myFile) { /* yeah, we have to use use ($myFile) here, which isn't really helpful in this context */ | ||
+ | if (!file_exists($myFile)) { | ||
+ | throw new Exception(" | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | /* New code */ | ||
+ | runDebug(() ~> { | ||
+ | if (!file_exists($myFile)) { | ||
+ | throw new Exception(" | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | /* still continue here, unlike an assert which would unwind the stack frame here ... */ | ||
</ | </ | ||
==== Partial application ==== | ==== Partial application ==== | ||
- | The short hand syntax makes it easier to write functional code like a reducer by using the ability of shorthand anonymous functions to be chained together easily. | + | The shorthand |
Current syntax: | Current syntax: | ||
Line 218: | Line 261: | ||
return [$x => $x * 2]; | return [$x => $x * 2]; | ||
</ | </ | ||
+ | |||
+ | Additionally, | ||
+ | |||
+ | Also, Hack has some possibilities of typing here, which do not work with PHP, due to technical reasons. Regarding forward compatibility, | ||
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
Line 233: | Line 280: | ||
private $bar: | private $bar: | ||
- | getBar ~> $this-> | + | getBar() ~> $this-> |
setBar($bar) ~> $this-> | setBar($bar) ~> $this-> | ||
} | } | ||
Line 248: | Line 295: | ||
As an alternative, | As an alternative, | ||
- | ===== Proposed Voting Choices | + | ===== Vote ===== |
This RFC is a language change and as such needs a 2/3 majority. | This RFC is a language change and as such needs a 2/3 majority. | ||
- | It will be a simple yes/no vote. | + | Voting opened September 22th, 2015 and will remain open until October 2nd, 2015. |
+ | |||
+ | <doodle title=" | ||
+ | * Yes | ||
+ | * No | ||
+ | </ | ||
===== Patch ===== | ===== Patch ===== | ||
Pull request is at https:// | Pull request is at https:// |
rfc/short_closures.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1