On Sun, 10 May 2020 at 17:49, Ralph Schindler <ra...@ralphschindler.com>
wrote:

> Hi!
>
>
> # Intro
>
> I am proposing what is a near completely syntactical addition (only
> change is to language.y) to the language. The best terminology for this
> syntax is are: `return if`, "return early", or "guard clauses".
>
>    see: https://en.wikipedia.org/wiki/Guard_(computer_science)
>
> Over the past few years, I've seen a growing number of blog posts,
> conference talks, and even tooling (for example code complexity
> scoring), that suggest writing guard clauses is a good practice to
> utilize.  I've also seen it more prevalent in code, and even attempts at
> achieving this with Exceptions (in an HTTP context) in a framework like
> Laravel.
>
>    see abort_if/throw_if:
> https://laravel.com/docs/7.x/helpers#method-abort-if
>
> It is also worth mentioning that Ruby has similar features, and I
> believe they are heavily utilized:
>
>    see:
> https://github.com/rubocop-hq/ruby-style-guide#no-nested-conditionals
>
>
> # Proposal
>
> In an effort to make it a first class feature of the language, and to
> make the control flow / guard clauses more visible when scanning code, I
> am proposing this in the syntax of adding `return if`.
>
> The chosen syntax is:
>
>    return if ( if_expr ) [: optional_return_expression] ;
>
> As a contrived example:
>
>      function divide($dividend, $divisor = null) {
>          return if ($divisor === null || $divisor === 0);
>
>          return $dividend / $divisor;
>      }
>
> There is already a little discussion around the choice of order in the
> above statement, the main take-aways and (my) perceived benefits are:
>
>    - it keeps the intent nearest the left rail of the code (in
> normal/common-ish coding standards)
>
>    - it treats "return if" as a meta-keyword; if must follow return for
> the statement to be a guard clause.  This also allows a person to more
> easily discern "returns" from "return ifs" more easily since there is
> not an arbitrary amount of code between them (for example if the return
> expression were after return but before if).
>
>    - it has the quality that optional parts are towards the end
>
>    - is also has the quality that the : return_expression; is very
> symmetrical to the way we demarcate the return type in method signatures
> "): return type {" for example.
>
>    - has the quality of promoting single-line conditional returns
>
>
> # Finally
>
> One might say this is unnecessary syntactic sugar, which is definitely
> arguable. But we do have multiple ways of achieving this.
>
> Of course all of these things should be discussed, I think sub-votes
> (should this PR make it that far) could be considered.
>
> The PR is located here:
>
>    https://github.com/php/php-src/pull/5552
>
> As mentioned, some discussion is happening there as well.
>
>
> Thanks!
> Ralph Schindler
>
>
> PS: since implementing the ::class feature 8 years ago, the addition of
> the AST abstraction made this kind of syntactical change
> proof-of-concept so much easier, bravo!
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php


Hello Ralph,

Have you written a formal RFC document? If not, you should do it for this
RFC: https://wiki.php.net/rfc/howto.

Reply via email to