Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:113799 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 26262 invoked from network); 26 Mar 2021 12:16:25 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 26 Mar 2021 12:16:25 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id B03CE1804B8 for ; Fri, 26 Mar 2021 05:12:40 -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-f51.google.com (mail-lf1-f51.google.com [209.85.167.51]) (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 05:12:39 -0700 (PDT) Received: by mail-lf1-f51.google.com with SMTP id a198so7335984lfd.7 for ; Fri, 26 Mar 2021 05:12:39 -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=EMMJdOlM37cFKS0s8hu0YZdaugwtU+NES0w+Y1qnSno=; b=XNDDAhy3OQ4VqYQVhj82kJnx5QxK3Yx72Z+gDYOPiWo9rxyvR4vkDiOPd+eBuvbihF phtYqpqn/0kL/hYwY7l0ydK/jVmhw+0uagOlefWeOBX65zYaQyE/iYQbxn8EwJRWmQbk 6vG8JdxgYGPsU65qC7KhVPYioizRi5GPk34R3SvWOHW21UqWAwO4sLzs4M2P5RxyjC80 Y83Nop0sT/76q3Y412tfWHG3FbjL+P3JdnD9OxjcLKLN+qv2HgkclbinmA6t5UqbG3J8 zZWcQpLL9ksNlk7pimqLx2a3+HXNfJ2oY/mZXdZHZgQ2fM1q34VhUzZ18ZM9d14lFRJA 0lyg== 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=EMMJdOlM37cFKS0s8hu0YZdaugwtU+NES0w+Y1qnSno=; b=gcs6X7wzGhHlcG2rimS9+7nsEk/rLsm37nUTz/c7aYICRQVUVUDFE3tlaIsPoBInZl QVm5cVI0R4RP4p0IEziZWf9VcNOvNwsF4nTUD5HCuhUbHxA0OovFeHMK7tduuQvojZb4 zBDMZpn2+RXnFAJG1unEnojSMEC3x+hokzVX3k4TImLAiIEz2I1H6Q+voT7D5kCgSeWG 2Jo6z2D3N3RWm3F2oHfmhOHvofGVzh9NaOAhCrd9cH78xmorsTAA+2C/FES5fAnFc6WA g/TvVFOYUcUqyRNqN7faNuIppdL5nqP+hawiw7Bx+dbLAkFwzqE+AK/jCw8miLKGrlLh XCKQ== X-Gm-Message-State: AOAM530jIMT7NxR/e/RTzpqZj5PfrB2iF/clMjhkqXcaapjd+lpLU+qI 092PBOHBPu4cr8O04FNUWNnxbSAna+6VBiTWKI60388G X-Google-Smtp-Source: ABdhPJxFALQ6SF+6esGR0pJ/VJ/ZA0RdAN9ikRBWjlBDWRiQ2b/mjvqSJoQ61mi4L7sd8pktv298F57SKRvMzynEIok= X-Received: by 2002:a05:6512:3d1c:: with SMTP id d28mr7665372lfv.41.1616760754878; Fri, 26 Mar 2021 05:12:34 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:ab3:5f8f:0:0:0:0:0 with HTTP; Fri, 26 Mar 2021 05:12:32 -0700 (PDT) In-Reply-To: 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> Date: Fri, 26 Mar 2021 13:12:32 +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 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, shorter >>>>>>> to >>>>>>> write, and prettier to read *=E2=80=94 and the community love these= 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 space >>>>>> devoted to: >>>>>> >>>>>> * Why we need this feature. What has changed since it was left out o= f >>>>>> the >>>>>> arrow functions RFC? What problems is it addressing? Why do you thin= k >>>>>> it >>>>>> is the best approach to those problems? >>>>>> * The exact semantics proposed: How will the variables to be capture= d >>>>>> be >>>>>> determined? Will it distinguish variables which are written before >>>>>> they're >>>>>> read, and if so how is that defined? Can auto-capturing closures be >>>>>> nested, i.e. will "fn() { return fn() { echo $a; } }" capture $a fro= m >>>>>> the >>>>>> outermost scope? And so on... >>>>>> >>>>>> >>>>>>> Besides, one advantage of this RFC is that it is consistent with th= e >>>>>>> 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, w= e >>>>>> 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 that = 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 vertica= l > split screen in our editors =E2=80=94 I am constantly battling with lines= 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 how= it > is really even a problem? Or are you arguing that you fear people will j= ust > 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 if > 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. Olle