Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:114551 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 20320 invoked from network); 21 May 2021 07:42:22 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 21 May 2021 07:42:22 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 9DE4F1804B5 for ; Fri, 21 May 2021 00:52:34 -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=-1.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,FREEMAIL_REPLY, 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-ed1-f42.google.com (mail-ed1-f42.google.com [209.85.208.42]) (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, 21 May 2021 00:52:34 -0700 (PDT) Received: by mail-ed1-f42.google.com with SMTP id i13so22280648edb.9 for ; Fri, 21 May 2021 00:52:34 -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=eKPHZkEEPj2OAoreB1QSnOggAslZoKSy6lxGvpvvACA=; b=IVl1dwl4IvTy4WSKZKQU8dMTSAKOSuyJSXTAJe0G6KdkZiJtJn+0h/ggm/HgKyeRQf ZPlUskL2qqHiJs7qPW6EleOdbcPSLjG/koOtSbMgX8T9H2vE8msCA9adT3iHT4UX7HML vjveKYpHJqZkhd36TeXnFyTfkGBHSg8ASm+H4dClf5oBJhzj/3PhWlv15OJ01pc8gwy6 IkIpL/xtnDVjzFcypnjvGqDR1h66iVnErdOLQdkRFNAEFC7/Gf3R5VmH3gYAB9GwJgdr GS1sEeuuqj2jOr2ral+e9TeW1Wv4DXfUkSSdCd581mN5RTIPdJDcP+FHY0iGjijtExTz PmVA== 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=eKPHZkEEPj2OAoreB1QSnOggAslZoKSy6lxGvpvvACA=; b=p/TEHraTCwg8lxpnaiYlm/VV1+E70bxEQC7ydHg5XlelinGWeEChjBVlXyRhTL3rDq uuJzxb1az0lzElddJerpVmii985I+OeJHh4GFrT4SxfKPumWhCN0krSfyPmQAsurn1kr OL7RO+u0P0CIqoVeqDRC/zAaEI2UPfssMhUnals28EnUStZ23OT/bmI2tdM/5FcaYaNm 6NOhWq1yuDQsQ1e9SfkmaH0kX4/XjuK7lpmQ4Jy6bPRVoDxiBhdRjjAHUyXXUV2bPqFF fnLBHW/KvBTKfTeFPE+/OUgwKe0FYbBkcM9CbqHMM+xMnTSIN2g5vi2JIR7pWsDr7bHe G3oA== X-Gm-Message-State: AOAM532VUpkOoV+J+PVYGZQlfSKmnYqUhoIfCcvoOOUvp39ZW1K4FUXW akgPaRlhTcnQPymkPp1z/FbATHe7X8pcJg2b5iJkoLBdJw5Dug== X-Google-Smtp-Source: ABdhPJyow8W8UZymB5EBmeIloINCGncVWAsYgP1KrCOErF5FzozmP8y0Bl5/b7/AaFGNnrpE3FAU6vOXPcp3NPXTTm8= X-Received: by 2002:a50:9346:: with SMTP id n6mr9720988eda.365.1621583549559; Fri, 21 May 2021 00:52:29 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: Date: Fri, 21 May 2021 09:52:18 +0200 Message-ID: To: Larry Garfield Cc: php internals Content-Type: multipart/alternative; boundary="00000000000071f8df05c2d25773" Subject: Re: [PHP-DEV] [RFC] First-class callable syntax From: nicolas.grekas+php@gmail.com (Nicolas Grekas) --00000000000071f8df05c2d25773 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sorry for self-reply, this needs some clarifications :) Le ven. 21 mai 2021 =C3=A0 09:17, Nicolas Grekas a =C3=A9crit : > Thank you all for your efforts, I think we're almost there and that PFA > would be a really great and useful addition to the language. > > Le jeu. 20 mai 2021 =C3=A0 21:38, Larry Garfield = a > =C3=A9crit : > >> On Thu, May 20, 2021, at 10:55 AM, Guilliam Xavier wrote: >> > On Thu, May 20, 2021 at 5:12 PM Nikita Popov >> wrote: >> > >> > > On Thu, May 20, 2021 at 4:16 PM Ond=C5=99ej Mirtes >> wrote: >> > > >> > > > Hi, I=E2=80=99m confused by the syntax, when I read it, I think to= myself >> =E2=80=9CI know >> > > > this, this is just a method call=E2=80=A6 oh wait, it=E2=80=99s ac= tually a >> callable=E2=80=9D. It >> > > > really makes my head hurt. >> > > > >> > > >> > > Yes, I can see how that could be confusing. The current syntax is >> chosen to >> > > be a subset of the partial function application proposal. However, I >> would >> > > also be happy with some other syntax that makes it clearer that this >> is >> > > acquiring a callable and not performing a call. >> > > >> > >> > Hi, several other syntaxes have been proposed to consideration in the >> PFA >> > thread, and I wouldn't want to start new bikeshedding here; is there a >> > place that would be more appropriate to gather the possibilities (like= a >> > kind of updatable list)? >> > >> > Thanks, >> >> There's been a lot of rapid iteration, experimentation, and rejection. >> The most recent alternatives are this one from Levi: >> >> https://gist.github.com/morrisonlevi/f7cf949c02f5b9653048e9c52dd3cbfd >> >> And this one from me: >> >> https://gist.github.com/Crell/ead27e7319e41ba98b166aba89fcd7e8 >> >> The main takeaways (to give context to Nikita's proposal): >> >> * Because of optional arguments, using the same symbol for "copy one >> parameter from the underlying function" and "copy all remaining paramete= rs >> from the underlying function" is not viable. It runs into oddball cases >> where you may intend to only use one argument but end up using multiple, >> especially in array operation functions that sometimes silently pass key= s >> along to callbacks if they can. Hence the separate ? and ... that were >> proposed. >> > > I've read that some ppl think this should be fought, but that's actually = a > critical feature of the engine when writing BC layers by adding extra > arguments via this possibility. > I'm talking about implicit extra arguments accessed via func_get_args() here. In the 2nd gist, I read "If the current position is a ..., copy all > remaining parameters from the underlying function, including a variadic." > But to me it's important that all extra arguments are forwarded to the > partialized callable, where ... is used or not. > Please clarify this point if possible. > > * Named arguments make things more complicated. One of the questions is >> whether named placeholders should be supported or not. And if they are, >> does that mean you can effectively reorder the arguments in the partial >> application, and what does that mean for usability. It gets complicated >> and scope-creepy fast. >> > > For the userland pov, the principle of least surprise would say we should > answer yes to both questions. > Reading your gists, I'm with drawing this expectation. Since calls reorder named arguments automatically, we could expect the same for PFAs. That is: since foo(A: 1, B: 2) is exactly the same as foo(B: 2, A: 1) we could also expect that foo(A: ?, B: ?) would be exactly the same foo(B:?, A:?) The issue here is that the syntax can be interpreted as both a new signature and as a partial call. If we stay pure to the intend of PFAs, argument reordering shouldn't be allowed IMHO. Aka this should be interpreted only as a partial call. *If* we need a way to reorder arguments, I think it would be natural also to be able to *rename* arguments. That's where my syntax proposal based on short closures might be handy: fn($a, $b, ...) =3D> $callable($b, a: $a, ...) > > >> We also went down a rabbit hole of trying to make argument reordering >> work because some people asked for it, but as noted that's a very deep >> rabbit hole. >> > > Then maybe named args should be forbidden for "?" placeholders. This woul= d > keep this possibility open of the future and close the "principle of leas= t > surprise" expectation if there are. Aka foo(bar: ?) should be a parse err= or > for now at least. > > My own take is that the PFA discussion has been overly-bikeshedded, which >> is unfortunate since I think we're quite close to now having a workable >> answer that covers most reasonable use cases. While I agree Nikita's RF= C >> here would be an improvement over 8.0, I don't think throwing in the tow= el >> on PFA yet is a good idea. It's a much more robust and powerful approac= h >> that still gets us the "first class callable" syntax we all want (at lea= st >> I assume we all do), and lots of additional power to boot. I'd rather s= ee >> us try to drive PFA home to completion. If that proves impossible by ea= rly >> July, then this RFC would still get us something this cycle, as long as = the >> syntax is still compatible with PFA. (Otherwise whenever PFA gets sorte= d >> out in the future we end up with yet-more-ways to do the same thing that >> are not optimizations of each other but just competing syntax, in which >> case no one wins.) >> > > I agree. Let's figure out PFAs! > > If I may add to the bikeshedding, and since PFAs are like others said > "short lambas on steroids", what about borrowing the syntax from them? > > Here would be the first-class callable syntax: > > fn(...) =3D> $callable(...) > > and for PFAs: > > fn(...) =3D> $callable(?, 42, ...) > > Nicolas > --00000000000071f8df05c2d25773--