Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:113778 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 28481 invoked from network); 25 Mar 2021 15:39:43 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 25 Mar 2021 15:39:43 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 2AD4C1804B7 for ; Thu, 25 Mar 2021 08:35:46 -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,SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from mail-vk1-f178.google.com (mail-vk1-f178.google.com [209.85.221.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 ; Thu, 25 Mar 2021 08:35:45 -0700 (PDT) Received: by mail-vk1-f178.google.com with SMTP id k76so487095vkk.10 for ; Thu, 25 Mar 2021 08:35:45 -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=KXlZH/E6TKM2yvfxDf4p/1ojMauwHE7US6qmLwNKorM=; b=RYJ11SozBYn9FozDxY7fjn2oIS1U8IMeBQ2sUbc0TCduDxVfiuOdZW+f5mml9o/BzD NlRbds5MfBxxo6WggCxIhA2CzRorii13/pMKZ8SejCIMdqYoVRESkkcaTDW/1LwkIqP3 810nP4cgb1DAUb8pMyMVGprlkb+YbZEpr6mBFPp03IWfNq1gcccPtCy6F1dPagH8H6Qt 9lnAgXfM9d8Q9niM4ZiPCLoFfwXIohJsNL5nGVD6wLY6OWQEppyN6AEvYNSJTiqLcSob FxtTeHtA0xqex+8rL5K6b3RfT3/CWvfN2heiqNnf+Tr1JQDIUaibeFo4xKXwsLiNmSld SmPg== 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=KXlZH/E6TKM2yvfxDf4p/1ojMauwHE7US6qmLwNKorM=; b=AZ2i+1u/0jmJorCYD3Ajh+xqHzNqj9lDMrk60ILd8yIzvQWRSjTzhDvpYULiH0YjJe X70m8uFbW+sMPGsaqjCZEt4vfiZUPHNmBLw4mZ0jtDTdbldZsz/q/CEocYw/JjnjoL38 cgiwhjKyTiBOT6A4P2zJaBeN5oE7HDFB1Sgxb5nQhOvNNAvVgK+nENi3By3H39dE85DU 9TCQKPRIcxl2P2n2Tjs5HvQpz01ZbT0jmQ+PKF/uOYRKCmb7A3vu8VaTghhsngHTn0Um 9P/6U2WqggGDgi13u9UlZGy1h3utIY/dkvMzoVLf6CqFqvBu23qBG36URWU3my0NH18h Do1w== X-Gm-Message-State: AOAM53084sYaTYG8wgiO2AY6Wlp8AIdpQSx6Np4aDXsiLo54XFh4a6YR oWHqADGQUA4Jmpx5l+FtnOEXi79VXd5Z0cTkxx/BmtYeqkI= X-Google-Smtp-Source: ABdhPJyHTNw3Mn0iVHa98q/9FoKJAeP/AUvRsuBFBRfjQKRftamr13bloYlA54gfFgp+uHmnG+0Sk+mX6cw9DkfMr/E= X-Received: by 2002:ac5:c296:: with SMTP id h22mr5564848vkk.9.1616686544262; Thu, 25 Mar 2021 08:35:44 -0700 (PDT) MIME-Version: 1.0 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> <5D33D73A-6B75-456B-9774-91F71FF450BA@cschneid.com> In-Reply-To: <5D33D73A-6B75-456B-9774-91F71FF450BA@cschneid.com> Date: Thu, 25 Mar 2021 11:35:32 -0400 Message-ID: To: Christian Schneider Cc: php internals Content-Type: multipart/alternative; boundary="0000000000002f1a6d05be5e2b81" Subject: Re: [PHP-DEV] [RFC] Auto-capture multi-line closures andshortfunctions take 2 From: matthewmatthew@gmail.com (Matthew Brown) --0000000000002f1a6d05be5e2b81 Content-Type: text/plain; charset="UTF-8" On Thu, 25 Mar 2021 at 10:23, Christian Schneider wrote: > Am 25.03.2021 um 14:29 schrieb Mark Randall : > > On 25/03/2021 09:28, Rowan Tommins wrote: > >> That's not quite what I meant. I meant that you can't say "capture by > default, but this variable is definitely local". > > > > I think if there's one argument against, this would be it, but IMHO it > is a weakness in PHP as a whole. > > I'm not sure if I misunderstand what you're saying but to me it is one of > the greatest things about PHP that everything is local by default (minus a > narrow set of well-known and easily enough recognizable things). > > > The solution would be adding JS-like let / const statements. Which would > be a benefit to other things too. > > > I disagree that this is the solution. I think JS had to add var and later > let because of the unfortunate decision to have C-like scoping rules. > Making scoping in PHP more complex to be able to repeat this mistake in > some form seems ill-advised to me. > > - Chris > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: https://www.php.net/unsub.php > > This is also my feeling. While it's easy to see from the single line fn ($x, $y) => $x + $y + $z that $z is auto-captured, it's much less easy to see that in fn ($x, $y) { $x += $y >> 2; $y = 2 - $y; $z -= 4; return $x + $y + $z; } Here's an example of this auto-catpuring multi-line functions in use today: https://github.com/hhvm/hhast/blob/bb0f0445b2e693270079dcced01a29919d87e955/src/Migrations/IsRefinementMigration.hack#L54-L111 I think that code would be more a little more readable with an explicit closure function($node, $parents) use ($map) { Lastly, PHP's handling of arrays adds an auto-capturing gotcha: fn ($x, $y) { $z[] = 1; return $x + $y + count($z); } This is valid whether or not $z is defined before the closure. --0000000000002f1a6d05be5e2b81--