Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:113773 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 19168 invoked from network); 25 Mar 2021 14:45:14 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 25 Mar 2021 14:45:14 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id DD9391804D0 for ; Thu, 25 Mar 2021 07:41:16 -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,NICE_REPLY_A, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from mail-ej1-f41.google.com (mail-ej1-f41.google.com [209.85.218.41]) (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 ; Thu, 25 Mar 2021 07:41:16 -0700 (PDT) Received: by mail-ej1-f41.google.com with SMTP id u21so3265833ejo.13 for ; Thu, 25 Mar 2021 07:41:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-transfer-encoding:content-language; bh=nBACqVRsdeLvblhWlVpx+ekmaJw+4E6ZYMb5uJub+Fw=; b=XOu40RriPGu7ZlF4s/x7h7Js8KZFap2MubQgRMompk53vmHBEv8XOqbxZLwKEldN+A PSpBVN9eohQ2YIGbwMlgUoAi6s4+i5jw0Az1D+3vLzpAvXGtRsXU0EFHhUYCTkJEVRBi fdSsAXaNSMJZXvZApDojkku5UR7gS2Ztz7wcQALzGFbS5d+uST/8sur+SS2BTGErHkQ1 w+T/nSPCkavmETV7gwnGQkeE4uvamPMozHwgaAPMDTTvhx+2JDU9OaXMpRlEcL8Xj6Zk lYzrfskS6Cs4Wui623XfZ3Fer0wahEu+uMYGYIC9n+4wo6tFZD4GV21xEXiGr9h+pw6r xeBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=nBACqVRsdeLvblhWlVpx+ekmaJw+4E6ZYMb5uJub+Fw=; b=ijW+6aFdyyrzKKhBCMAXz2OHtipzrx/BKmsIt6L+vLB85pIAGSLMxzfBytGSFxwlHO 6UCsdrDtyHdflig3sRzWp2HzqPc5XZHzplW//W3WEbVX3Onxx+5oNgXRRxIdBbMQFTM9 ypFmI29SnwDLp6f7XC6RKTjVOyswnwxiDOfxTA4N3N/v64XBA59oNxOg6VLFe709ylJn Le5IzjiYeYqF7dCmJMvUMCfCNP0mPiz25HgPHHA47Q+MGzkvKciJAYtfrGU/2GvO3QqY ob4zGJVZZqzNSXqhCR1y6acwRwQVJPaJpBUYQSdfrREOVVPeNS5OKmSQqR0pRVASbBft nMVw== X-Gm-Message-State: AOAM533TAukmDoAHOeG4U4oRxq2jucyNQc6L0Cdbc5/Ok25C/xtTxG4E 5qnrxOmieTF4oi7OP5fC5FaVFkUwoGk= X-Google-Smtp-Source: ABdhPJze+xSgbyOjf1trzigXC2ZVp2KwE30QBPc9IRyIBXJuB8zwsgCzTBdTgUJ3VdC3+UTzd4ClWQ== X-Received: by 2002:a17:906:fc1c:: with SMTP id ov28mr9810348ejb.342.1616683272821; Thu, 25 Mar 2021 07:41:12 -0700 (PDT) Received: from [192.168.0.22] (cpc104104-brig22-2-0-cust548.3-3.cable.virginm.net. [82.10.58.37]) by smtp.googlemail.com with ESMTPSA id i10sm2510970ejv.106.2021.03.25.07.41.12 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 25 Mar 2021 07:41:12 -0700 (PDT) To: internals@lists.php.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> Message-ID: Date: Thu, 25 Mar 2021 14:41:12 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-GB Subject: Re: [PHP-DEV] [RFC] Auto-capture multi-line closures and shortfunctions take 2 From: rowan.collins@gmail.com (Rowan Tommins) 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 *— 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 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 be 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. * There is no obvious way to expand it to support any by-reference capture, which is something people have previously expressed a desire for. Regards, -- Rowan Tommins [IMSoP]