Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:110110 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 3151 invoked from network); 10 May 2020 18:19:22 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 10 May 2020 18:19:22 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 59D3B1804CB for ; Sun, 10 May 2020 09:55:34 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2, SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-ASN: AS15169 209.85.128.0/17 X-Spam-Virus: No X-Envelope-From: Received: from mail-il1-f178.google.com (mail-il1-f178.google.com [209.85.166.178]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Sun, 10 May 2020 09:55:33 -0700 (PDT) Received: by mail-il1-f178.google.com with SMTP id t12so6180790ile.9 for ; Sun, 10 May 2020 09:55:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=VHV2Mt16cTP2bxcbnEAPIszUBC4xKy+NFqNm7078K3Y=; b=GRx8cczZGOxL5IGFpSH47ZOJWGXRvdE2V2PassMvcy75DWTJ4XdkywxRj4I56VICbK uxMMyDEhyRfKWViCAyAZwQQX/BbaqoQwXwzBAXjUYTx69QMUia3Y4n7ziozOgzwwqpyI XUzc9EtKLm/15j+LZugDutIpRXQVRjitjjoFf9Hcvl9LAdOCAOhDUHZqEWq+a3MaVmty ZNVKWADCQBkKT2YmtCLSBP1OhAqMWD+U9u/bsD0HGYtfnwRYtjiQmv1bkFk2gobHJnl9 cUdDpFYMrsQOdmvtnAi+kq5ii+sGn93z18eVC7xc/8zAjeMPt99q53a+zbWnT2xt7kOh +Ulg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=VHV2Mt16cTP2bxcbnEAPIszUBC4xKy+NFqNm7078K3Y=; b=hOBWE2RaJJ3XijOjPuj3DjanfFZIFRLWxtaeGRlfgqDhPK1U9TNUkLGXtqrOyCm5/i RG67tVdUXU2E0zKSoanUe4yJwZTK4j9VbbQbsTRZZtEVaRbzHd4/WtZi767iHP1ecjvh JDmr5tIKOu4BI2Pi2BwtmTzKnrSnThbPnsvVHdHRx0zG6rUP/5k/QQejoRt6TDv75XUc vXkkW57r1afckdYfJ3LMsOPGnYF3MIZCakk17ew/19kd5qnMHzQjcZpeCtERbGA0ec8N pSDAgVAznIJseVDSrCm536g1VY6eSTiLu65rEFe2B0hHwIaNoKqyJNaHO4XNyvgl4CTY cG9g== X-Gm-Message-State: AGi0PubMsdJrwldBS6HRI3/GBZvfqSogfKq0j15HKAaNADkAPyWwKomv Auly2J8Jdi95SuYIGErFO5kBzPgfUG4NIUVxzRE= X-Google-Smtp-Source: APiQypKJ5vybUxV5bZdfytzbsitBJR3PmTFv77QOYUAyW8kcr/wFhjjGctod/P4QLxd9UGJLd0EFxOYZrZJuzy7sIDE= X-Received: by 2002:a92:5f1d:: with SMTP id t29mr5351598ilb.153.1589129731726; Sun, 10 May 2020 09:55:31 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: Date: Sun, 10 May 2020 18:55:20 +0200 Message-ID: To: Ralph Schindler Cc: PHP internals Content-Type: multipart/alternative; boundary="00000000000029606405a54e1926" Subject: Re: [PHP-DEV] Proposal For Return-If / Early Return / Guard Clause Syntax From: carusogabriel34@gmail.com (Gabriel Caruso) --00000000000029606405a54e1926 Content-Type: text/plain; charset="UTF-8" On Sun, 10 May 2020 at 17:49, Ralph Schindler 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. --00000000000029606405a54e1926--