Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:110112 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 30732 invoked from network); 10 May 2020 20:11:57 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 10 May 2020 20:11:57 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 7CD891804D3 for ; Sun, 10 May 2020 11:48:08 -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=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,HTML_MESSAGE, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,T_SPF_TEMPERROR 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-lj1-f170.google.com (mail-lj1-f170.google.com [209.85.208.170]) (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 11:48:07 -0700 (PDT) Received: by mail-lj1-f170.google.com with SMTP id l19so7107799lje.10 for ; Sun, 10 May 2020 11:48:07 -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=IT0KHP23YC+k45FTwc4uAh7955sA16q3uMc2Q1FmTJo=; b=tPiR/CXDdgU5gPG5Ay1+mQQa+SUqwyd/2/lnqjQjITWkBJfWfIJXEKounHoKST36zk deCFKyDQsTGri8Igcrk13cN4VSdk6VsjcYoNmyMocKy54jVmDJsIHbY1CMCVMcyhVdsX eTOy2kqz3jBALbLh5ql3uJXS4yJCacKeKGPhlEnGQzaYFAowgi79546C7EO+0NmbIF90 sj0XwJ9vKsqWah8zcjf8ovARWj8KJ5gpU1pZJFRQcqgcbLKzOYVE3G+GDpbatygZ8eVX 57pQ+g62BWG3SzzcTp1FQ219F75w9AWDv8r6xWvsrinO1qso7NnhY57gS7udROYdlIJn MFjA== 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=IT0KHP23YC+k45FTwc4uAh7955sA16q3uMc2Q1FmTJo=; b=M0T8569SIJYxkaRg+eH8dq5/bLp01BJo+Wn4VvmQVcjeeY5Hymb2L15EMhX2OPqjJY DNuyfzlw3BdWVR/KQ2iqxEwowERVqUtIK5vDLPnS3cOzIOoygwkUPkky8tf44xBJ57fP mM5ev0DkS3/tBCeNSNvZ8qdeveV62niIaLPbkY6H2+516i31a3SQ8M0B2Pkz3Ea/eqoT jrmE25WPHxyfdxiU0vmJU90jm7BTcR2VJ0at5WSdOObrCs86TkVTQqUwAEARo9tVugrM Xwuompss/dV4LLzm/nsrydXO8kwF8hDjKmryxX5iOHtEoBeYzw4EUmZe16zAknLfkF+r 2Qyw== X-Gm-Message-State: AOAM5324jmcDcvKM8YMkerFaDJzFa4g39s1jFzjALcOo7q5QIIHiyZMm ziLUy6EfdW9TGgj/8HkCJ62tEGKTMHKSKRLTXfvSfXVa X-Google-Smtp-Source: ABdhPJxrTworaAwm+Dk32v84hMo1SkZqOtkFXz9aqc7jge5RrofyZhjPc/RwxTw7YnY2uf/tp8q9Pl7314ESEanYyL4= X-Received: by 2002:a2e:8884:: with SMTP id k4mr8123465lji.267.1589136482558; Sun, 10 May 2020 11:48:02 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: Date: Sun, 10 May 2020 20:47:45 +0200 Message-ID: To: Ralph Schindler Cc: PHP internals Content-Type: multipart/alternative; boundary="0000000000008ae6c105a54fab3d" Subject: Re: [PHP-DEV] Proposal For Return-If / Early Return / Guard Clause Syntax From: nikita.ppv@gmail.com (Nikita Popov) --0000000000008ae6c105a54fab3d Content-Type: text/plain; charset="UTF-8" On Sun, May 10, 2020 at 5:49 PM 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! > This proposal looks way too specific to me. I'm a big fan of returning early -- but also of throwing early, breaking early and continuing early. Supporting this just for returns seems odd / inconsistent to me. That said, I don't think this syntax solves a real problem in the first place. If it solves a problem, it's mostly a problem of PHP coding styles being a bit overzealous when it comes to formatting requirements for early return/break/continue/throw. And that's not a problem that needs solving at the language level... Regards, Nikita --0000000000008ae6c105a54fab3d--