rfc:short-functions
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
rfc:short-functions [2021/03/19 19:12] – crell | rfc:short-functions [2021/04/25 18:55] – Header formatting tweaks crell | ||
---|---|---|---|
Line 3: | Line 3: | ||
* Date: 2020-10-20 | * Date: 2020-10-20 | ||
* Author: Larry Garfield (larry@garfieldtech.com) | * Author: Larry Garfield (larry@garfieldtech.com) | ||
- | * Status: | + | * Status: |
- | * First Published at: http:// | + | * First Published at: http:// |
===== Introduction ===== | ===== Introduction ===== | ||
Line 19: | Line 19: | ||
function add(int $a, int $b): int | function add(int $a, int $b): int | ||
{ | { | ||
- | return $a + b; | + | return $a + $b; |
} | } | ||
</ | </ | ||
Line 48: | Line 48: | ||
Functions are simpler than lambdas, as there is no need for closing over variables contextually. | Functions are simpler than lambdas, as there is no need for closing over variables contextually. | ||
+ | ==== Consistency with closure syntax ==== | ||
+ | |||
+ | This RFC is designed to complement the [[rfc: | ||
+ | |||
+ | |||
+ | * The '' | ||
+ | * '' | ||
+ | * The '' | ||
+ | * The '' | ||
+ | * A function with a name is declared globally at compile time. A function without a name is declared locally as a closure at runtime. | ||
+ | |||
+ | These rules are easily recognizable and learnable by developers. | ||
+ | |||
+ | (Further discussion of the possible permutations, | ||
==== Reasoning ==== | ==== Reasoning ==== | ||
Line 55: | Line 69: | ||
Expressions are becoming increasingly capable, too. match() expressions and throw expressions in PHP 8.0, plus proposals such as [[rfc: | Expressions are becoming increasingly capable, too. match() expressions and throw expressions in PHP 8.0, plus proposals such as [[rfc: | ||
- | === Pure functions === | + | ==== Pure functions |
Expression functions are also more likely to be pure, and thus avoid mutable state. | Expression functions are also more likely to be pure, and thus avoid mutable state. | ||
Line 69: | Line 83: | ||
However, such code would be readily apparent as using global mutable state, and is easily avoided. | However, such code would be readily apparent as using global mutable state, and is easily avoided. | ||
- | ==== Examples ==== | + | ===== Examples |
Below are some examples of "long form" current code and what the short function equivalent would be. This RFC asserts that the shorter version is more concise and readable. | Below are some examples of "long form" current code and what the short function equivalent would be. This RFC asserts that the shorter version is more concise and readable. | ||
- | === Match functions === | + | ==== Match functions |
A function that encapsulates a match() expression. | A function that encapsulates a match() expression. | ||
Line 102: | Line 116: | ||
</ | </ | ||
- | === Enum methods === | + | ==== Enum methods |
In practice, most enum methods are likely to contain only a match expression, the evaluated value of which should be returned. | In practice, most enum methods are likely to contain only a match expression, the evaluated value of which should be returned. | ||
Line 133: | Line 147: | ||
</ | </ | ||
- | === Getter methods === | + | ==== Getter methods |
Many classes consist primarily or almost entirely out of methods that either return a property, or some computation off of a property. | Many classes consist primarily or almost entirely out of methods that either return a property, or some computation off of a property. | ||
Line 180: | Line 194: | ||
</ | </ | ||
- | === Functional code === | + | ==== Functional code ==== |
<code php> | <code php> | ||
Line 204: | Line 218: | ||
</ | </ | ||
- | === Conditional methods === | + | ==== Conditional methods |
A common refactoring technique is to take a complex conditional in an if statement and move it to its own method, so it can be given a self-descriptive name. Such methods are naturally single-expression. | A common refactoring technique is to take a complex conditional in an if statement and move it to its own method, so it can be given a self-descriptive name. Such methods are naturally single-expression. | ||
Line 229: | Line 243: | ||
Which is more simple and compact than a full function body. | Which is more simple and compact than a full function body. | ||
- | === Decorating functions in live code === | + | ==== Decorating functions in live code ==== |
Often times, methods exist that are just delegating to some other method, either in the same object or a composed object. | Often times, methods exist that are just delegating to some other method, either in the same object or a composed object. | ||
Line 397: | Line 411: | ||
The => operator has de facto become the "maps to this expression" | The => operator has de facto become the "maps to this expression" | ||
- | The author favors using " | + | The use of the '' |
- | As of this time, this RFC is to use " | + | ===== Related RFCs ===== |
- | + | ||
- | ==== Related RFCs ==== | + | |
A number of other RFCs in active consideration would complement short functions. | A number of other RFCs in active consideration would complement short functions. | ||
- | === Piped functions === | + | ==== Piped functions |
The [[rfc: | The [[rfc: | ||
Line 429: | Line 441: | ||
Which is a really nice way to build up a pipeline through composition. | Which is a really nice way to build up a pipeline through composition. | ||
- | === clone-with === | + | ==== clone-with |
Although no formal RFC has been proposed, Máté had discussed a '' | Although no formal RFC has been proposed, Máté had discussed a '' | ||
Line 437: | Line 449: | ||
{ | { | ||
public function __construct(private int $x, private int $y) {} | public function __construct(private int $x, private int $y) {} | ||
- | + | ||
- | | + | |
public function getX(): int => $this-> | public function getX(): int => $this-> | ||
public function getY(): int => $this-> | public function getY(): int => $this-> | ||
Line 445: | Line 456: | ||
public function withY($y): static => clone($this) with {y: $y}; | public function withY($y): static => clone($this) with {y: $y}; | ||
} | } | ||
+ | </ | ||
Thus making many cases of wither methods just as trivial to write as getter methods. | Thus making many cases of wither methods just as trivial to write as getter methods. | ||
- | |||
- | </ | ||
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
Line 469: | Line 479: | ||
[[https:// | [[https:// | ||
- | |||
- | [[https:// | ||
- | |||
- | Pull request for the spec still to come. | ||
===== Implementation ===== | ===== Implementation ===== |
rfc/short-functions.txt · Last modified: 2021/06/15 22:29 by ilutov