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 [2020/10/20 18:43] – crell | rfc:short-functions [2021/03/25 00:48] – Typo fix. crell | ||
---|---|---|---|
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 ==== | ||
- | Many functions and methods are, in practice, simple expressions. | + | Many functions and methods are, in practice, simple expressions. |
- | 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: |
- | Expression functions are also more likely to avoid mutable state. | + | === Pure functions === |
+ | |||
+ | Expression functions are also more likely to be pure, and thus avoid mutable state. | ||
+ | |||
+ | <code php> | ||
+ | |||
+ | $called = 0; | ||
+ | |||
+ | function | ||
+ | => sprintf(' | ||
+ | </ | ||
+ | |||
+ | However, such code would be readily apparent as using global mutable state, and is easily avoided. | ||
==== Examples ==== | ==== Examples ==== | ||
Line 88: | Line 114: | ||
print pick_one(1) . PHP_EOL; | print pick_one(1) . PHP_EOL; | ||
+ | </ | ||
+ | |||
+ | === Enum methods === | ||
+ | |||
+ | In practice, most enum methods are likely to contain only a match expression, the evaluated value of which should be returned. | ||
+ | |||
+ | <code php> | ||
+ | enum Suit | ||
+ | { | ||
+ | |||
+ | case Hearts; | ||
+ | case Diamonds; | ||
+ | case Clubs; | ||
+ | case Spades; | ||
+ | | ||
+ | public function color(): string => match($this) { | ||
+ | static:: | ||
+ | static:: | ||
+ | }; | ||
+ | | ||
+ | vs: | ||
+ | | ||
+ | public function color(): string | ||
+ | { | ||
+ | return match($this) { | ||
+ | static:: | ||
+ | static:: | ||
+ | }; | ||
+ | } | ||
+ | } | ||
+ | |||
</ | </ | ||
Line 160: | Line 217: | ||
function str_contains(string $haystack, string $needle): bool => strpos($haystack, | function str_contains(string $haystack, string $needle): bool => strpos($haystack, | ||
</ | </ | ||
- | |||
- | === Piped functions === | ||
- | |||
- | The pipe operator |> is still pending in an RFC, but the feedback on it before was generally positive. | ||
- | |||
- | <code php> | ||
- | function doAThing(User $u) | ||
- | { | ||
- | return $u |> ' | ||
- | } | ||
- | </ | ||
- | |||
- | vs. | ||
- | |||
- | <code php> | ||
- | function doAThing(User $u) => $u | ||
- | |> ' | ||
- | |> ' | ||
- | |> ' | ||
- | |> ' | ||
- | ; | ||
- | </ | ||
- | |||
- | Which is a really nice way to build up a pipeline through composition. | ||
=== 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. Thus, well-factored code is likely to have a large percentage of its functions and methods be single-expression, |
<code php> | <code php> | ||
Line 206: | Line 239: | ||
protected function isGroupModerator(): | protected function isGroupModerator(): | ||
=> $this-> | => $this-> | ||
- | |||
</ | </ | ||
+ | |||
+ | Which is more simple and compact than a full function body. | ||
=== Decorating functions in live code === | === Decorating functions in live code === | ||
Line 317: | Line 351: | ||
That can collapse to this (a bit reordered): | That can collapse to this (a bit reordered): | ||
- | |||
<code php> | <code php> | ||
Line 378: | Line 411: | ||
The => operator has de facto become the "maps to this expression" | The => operator has de facto become the "maps to this expression" | ||
- | I opted to not change | + | The use of the '' |
+ | |||
+ | ==== Related RFCs ==== | ||
+ | |||
+ | A number of other RFCs in active consideration | ||
+ | |||
+ | === Piped functions === | ||
+ | |||
+ | The [[rfc: | ||
+ | |||
+ | <code php> | ||
+ | function doAThing(User $u) | ||
+ | { | ||
+ | return $u |> ' | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | vs. | ||
+ | |||
+ | <code php> | ||
+ | function doAThing(User $u) => $u | ||
+ | |> ' | ||
+ | |> ' | ||
+ | |> ' | ||
+ | |> ' | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | Which is a really nice way to build up a pipeline through composition. | ||
+ | |||
+ | === clone-with === | ||
+ | |||
+ | Although no formal RFC has been proposed, Máté had discussed a '' | ||
+ | |||
+ | <code php> | ||
+ | class Point | ||
+ | { | ||
+ | public function __construct(private int $x, private int $y) {} | ||
+ | |||
+ | |||
+ | public function getX(): int => $this-> | ||
+ | public function getY(): int => $this-> | ||
+ | |||
+ | public function withX($x): static => clone($this) with {x: $x}; | ||
+ | public function withY($y): static => clone($this) with {y: $y}; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Thus making many cases of wither methods just as trivial | ||
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
Line 387: | Line 468: | ||
PHP 8.1. | PHP 8.1. | ||
- | |||
===== Open Issues ===== | ===== Open Issues ===== | ||
Line 400: | Line 480: | ||
[[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