Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:113805 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 48332 invoked from network); 26 Mar 2021 16:52:15 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 26 Mar 2021 16:52:15 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 4A2F3180087 for ; Fri, 26 Mar 2021 09:48:31 -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, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from mail-lf1-f52.google.com (mail-lf1-f52.google.com [209.85.167.52]) (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 ; Fri, 26 Mar 2021 09:48:31 -0700 (PDT) Received: by mail-lf1-f52.google.com with SMTP id a198so8611827lfd.7 for ; Fri, 26 Mar 2021 09:48:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=+HSgvWyQ5thTdJGkW4p3ijaB7+DJqp0hRCwedor99yI=; b=TEVX6XYeXc7fRCshyJ+bYM/w3ke5ODv2oq6FD3Qt0aAeAbt7/Daf7HS7CWbqY2mPWM WuLaOI0PKrG4CX1fZuXlWSZBPIxrGMxZBVQarM7lYFDpydAqzXTd9LUG3nTJ8bMr3nIb b3obwZBwo/6pXhXIW3JGYrLpD0I6ZI5GQgkc85IKHTojTrcdcsRDbUtSsdrHVDjvC+oy ryDkO7VgsPAEHLqv03gmvBQCnaGmfVnYi1KqFBsAH3MD6ZNo4meLmhbFi5kJRiU965nf lz97keZzVuWV0pOHr1bN0An0KxJNnP8QJHYAUgwpYOCyXqL1CrilDKBAHeUpkVWhnaLT eyZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=+HSgvWyQ5thTdJGkW4p3ijaB7+DJqp0hRCwedor99yI=; b=S7u58ZWP8YT9MrTEk4P+iahgMySYzF7Tgsbudl1W3BNR0GAj7lEUhV7AyV4xQYap9g jNvoJfV+2wZHy0tSmkwsFTlN1g4n+IxhDtatdBNZNdSyDWwAMU0AhK0bO2PvzsZmiZ/s X4/+YiWU6M4c0RO1aXEYluN58XyJ/ycdtonTE53oWGi2E+dgH/JmCJbovfhi9I5pd+hB b2QxvZG4kZioqleesrhocHT5K63PDp3XkSyWvmuIkcC50b1K93Ig9hOZTM01b0MCvVjn ZohWHbJGFJYeueHUEs/8t6abgCV4bLrQxw2lZIiqMbDMdECvSGMP5kh7PhW8lS5fXsid Ty9A== X-Gm-Message-State: AOAM531gDOO2vZaEhgoO7Nc7DoOHRlZMTpZIdnHYgkWPjg6a2Wp/2vM7 AOGJURzz836KqjVJGuDtAIdf/dLqDc2JKEhg1M0AfwJX X-Google-Smtp-Source: ABdhPJwWhs40F6+8W1sCUF+VlWWuybv8aYLihw10Nr+j5Ij16Hx0BnH6SvWetkgkeBfzNU3/FEzqYAimCdrRbO3xzCA= X-Received: by 2002:a05:6512:3d1c:: with SMTP id d28mr8336287lfv.41.1616777308650; Fri, 26 Mar 2021 09:48:28 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:ab3:5f8f:0:0:0:0:0 with HTTP; Fri, 26 Mar 2021 09:48:27 -0700 (PDT) In-Reply-To: <5501FE70-FBED-47EB-8010-173644BC064F@newclarity.net> References: <88c9eb5f-f80c-4869-b7f8-1b58b9e2eaa3@www.fastmail.com> <4DC3B66E-A91A-4AA9-8872-8EE9DE92C2D4@cschneid.com> <8c72c162-83c0-7c7f-2fa7-4fbe3fb30a4a@gmail.com> <605bae82.1c69fb81.f49f7.d11eSMTPIN_ADDED_MISSING@mx.google.com> <919e30e7-3e5e-d955-7bb4-1e1b5825cdd1@gmail.com> <635DD146-FC6F-4991-8D2C-5A6B492722D5@newclarity.net> <734f12de-da98-6b76-c2fe-8682f4d177aa@gmail.com> <36E45DD6-E2BD-4801-BAAE-4355C83D1AC3@newclarity.net> <15AE4315-A456-4ED8-990A-49EBD76C5B46@newclarity.net> <5501FE70-FBED-47EB-8010-173644BC064F@newclarity.net> Date: Fri, 26 Mar 2021 17:48:27 +0100 Message-ID: To: Mike Schinkel Cc: PHP internals Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Subject: Re: [PHP-DEV] [RFC] Auto-capture multi-line closures and shortfunctions take 2 From: olleharstedt@gmail.com (=?UTF-8?Q?Olle_H=C3=A4rstedt?=) 2021-03-26 17:11 GMT+01:00, Mike Schinkel : >> On Mar 26, 2021, at 8:12 AM, Olle H=C3=A4rstedt >> wrote: >> >> 2021-03-26 3:38 GMT+01:00, Mike Schinkel : >>> >>> >>>> On Mar 25, 2021, at 4:09 PM, Olle H=C3=A4rstedt >>>> wrote: >>>> >>>> 2021-03-25 17:49 GMT+01:00, Mike Schinkel : >>>>>> On Mar 25, 2021, at 11:22 AM, Olle H=C3=A4rstedt >>>>>> wrote: >>>>>> >>>>>> 2021-03-25 16:02 GMT+01:00, Mike Schinkel : >>>>>>> >>>>>>> >>>>>>>> On Mar 25, 2021, at 10:41 AM, Rowan Tommins >>>>>>>> >>>>>>>> wrote: >>>>>>>> >>>>>>>> On 25/03/2021 12:31, Nuno Maduro wrote: >>>>>>>> >>>>>>>>> The reason why we believe the vast majority of PHP Developers are >>>>>>>>> going >>>>>>>>> to >>>>>>>>> appreciate this RFC is because multi-line short closures (aka >>>>>>>>> Auto-capturing multi-statement closures) *are more simple, shorte= r >>>>>>>>> to >>>>>>>>> write, and prettier to read *=E2=80=94 and the community love the= se >>>>>>>>> changes >>>>>>>>> as >>>>>>>>> proven on "property promotions", "one-line short closures", etc. >>>>>>>> >>>>>>>> >>>>>>>> My main point was that the RFC needs to spell out this argument, >>>>>>>> rather >>>>>>>> than taking it for granted that everyone agrees on "those >>>>>>>> situations >>>>>>>> where >>>>>>>> that is warranted". >>>>>>>> >>>>>>>> Most of the current text should be summarised in a "syntax choices= " >>>>>>>> section somewhere near the end. I would like to see much more spac= e >>>>>>>> devoted to: >>>>>>>> >>>>>>>> * Why we need this feature. What has changed since it was left out >>>>>>>> of >>>>>>>> the >>>>>>>> arrow functions RFC? What problems is it addressing? Why do you >>>>>>>> think >>>>>>>> it >>>>>>>> is the best approach to those problems? >>>>>>>> * The exact semantics proposed: How will the variables to be >>>>>>>> captured >>>>>>>> be >>>>>>>> determined? Will it distinguish variables which are written before >>>>>>>> they're >>>>>>>> read, and if so how is that defined? Can auto-capturing closures b= e >>>>>>>> nested, i.e. will "fn() { return fn() { echo $a; } }" capture $a >>>>>>>> from >>>>>>>> the >>>>>>>> outermost scope? And so on... >>>>>>>> >>>>>>>> >>>>>>>>> Besides, one advantage of this RFC is that it is consistent with >>>>>>>>> the >>>>>>>>> current syntax of the language and with the short-functions >>>>>>>>> RFC[2]. >>>>>>>>> For >>>>>>>>> example, by proposing that "fn" keyword indicates a function will >>>>>>>>> auto-capture variables, by value. >>>>>>>> >>>>>>>> >>>>>>>> While it's a cute rationalisation, there's no intuitive reason why >>>>>>>> "fn" >>>>>>>> should have that meaning; we could pick any aspect of the current >>>>>>>> arrow >>>>>>>> function syntax and say "the 'fn' keyword means that". >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> On the other hand "use (*)" has no usages / or current meaning in >>>>>>>>> the >>>>>>>>> language. >>>>>>>> >>>>>>>> >>>>>>>> This is a straw man argument. I could equally say that "fn() { } >>>>>>>> has >>>>>>>> no >>>>>>>> usages or current meaning in the language" - of course it doesn't, >>>>>>>> we >>>>>>>> haven't added it yet! >>>>>>>> >>>>>>>> The "function use() {}" part of "function use(*) {}" has a >>>>>>>> well-established meaning, and "*" to mean "everything" is a >>>>>>>> notation >>>>>>>> developers are likely to be very familiar with. >>>>>>>> >>>>>>>> The two disadvantages I see with using "fn" as proposed are: >>>>>>>> >>>>>>>> * Because it's shorter, people will decide it's the "better" >>>>>>>> version, >>>>>>>> when >>>>>>>> they don't actually need any variable capture. An explicit syntax >>>>>>>> like >>>>>>>> "use(*)" instead makes this a deliberate choice. >>>>>>> >>>>>>> And yet adding " use (*)" makes the syntax longer, which goes >>>>>>> against >>>>>>> one >>>>>>> of >>>>>>> the goals many people have for it: to be shorter. >>>>>> >>>>>> I don't understand why this is a target in the first place. Shorter >>>>>> does not mean more readable, and readable is more important than >>>>>> writable. >>>>> >>>>> I agree that readable is more important than writable, but shorter >>>>> also >>>>> does >>>>> not necessarily mean it is *less* readable, either. >>>> >>>> Sure. The brain removes noise and reads in "symbols" anyway (where >>>> "fn" or "function" is a symbol of size 1). >>> >>> That is actually not exactly true, at least not in all cases. >>> >>> When "nction" combined with " use (.....)" adds to line length such tha= t >>> a >>> developer must scroll horizontally to see all the text then it is not >>> the >>> same. >>> >>> And this is not a hypothetical for those of us who frequently use >>> vertical >>> split screen in our editors =E2=80=94 I am constantly battling with lin= es that >>> are >>> too long. >>> >>> Also when longer lines cause code to wrap on GitHub or in blog posts or >>> other places then it is not the same. >>> >>>> A more important aspect of readability is the cognitive load on >>>> short-term memory, or how many "chunks" the programmer has to keep in >>>> memory to understand a piece of code. In this case, I think >>>> immutability and local scope helps a lot, of which PHP has neither. Or >>>> maybe predictability of the scope? All language quirks hurt >>>> readability. I never had a problem with scope in JS, despite it >>>> lacking immutability and only recently got proper block scope. >>> >>> Given that the RFC prescribes by-value capture and not by-ref capture h= ow >>> it >>> is really even a problem? Or are you arguing that you fear people will >>> just >>> write closures hundreds of lines long? >>> >>> Maybe PHP should deprecate functions longer than 50 or 100 lines? >>> >>> >>>> Maybe more important than explicit/implicit capturing of scope is to >>>> keep your functions short...? In our legacy code-base, we have >>>> functions >>>> thousands of lines long. I can see auto-capturing being a problem >>>> there, but that's because of the technical debt and not the feature >>>> itself, I guess. Will our juniors realize that, tho? >>> >>> Now here is where I think the real problem is, the fact that other >>> developers write functions thousands of lines long. >>> >>> But realistically, legacy code won't be affected as people are rarely i= f >>> ever going to go back to your legacy code and convert a thousand line >>> function into a closure with auto-capture. >> >> No, I'm more concerned that someone will add a closer at the *bottom* >> of a long-ass function, capturing all variables, and then not have a >> properly defined lifetime, causing a memory leak or "spooky action at >> a distance" with object references. In other words, could it be a >> foot-gun? Maybe far-fetched, I don't know. > > Unless I misunderstand the RFC, the closure would only auto-capture the > variables that are specifically referenced inside the closure, so I don't > see it capturing *all* variables unless the developer intended it to by > referencing each one of them explicitly. > > And since the RFC captures the variables by-value I don't see how > auto-capture would be any different than using "use (...)," even with > objects. Oh yeah, good point. My argument is moot. Olle