Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:115195 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 37356 invoked from network); 28 Jun 2021 21:16:47 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 28 Jun 2021 21:16:47 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 481101804D8 for ; Mon, 28 Jun 2021 14:36:38 -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.6 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL, SPF_HELO_PASS,SPF_NONE autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from wout5-smtp.messagingengine.com (wout5-smtp.messagingengine.com [64.147.123.21]) (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 ; Mon, 28 Jun 2021 14:36:37 -0700 (PDT) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.west.internal (Postfix) with ESMTP id DD36232005BC for ; Mon, 28 Jun 2021 17:36:35 -0400 (EDT) Received: from imap43 ([10.202.2.93]) by compute1.internal (MEProxy); Mon, 28 Jun 2021 17:36:35 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :subject:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm3; bh=mNiAUJd6lYqc/D0DyXyOV+6/Fc0CnLftlki17Ey7W 8A=; b=CCSmbdA0mtk0U40Xse297s3AsU57AQcp4rdaSVycEGP2sNGsTBUSMdU5N QqUwY0XjD25sk9sVDRkHe03tED0sQFI1wrP9kwEs2+KYYMsf8nzl4fw5e7Z8g74U ZRddHyiWB42lH33ABRxi5KJmSopHap1MD4SP65iP1OUw/31vq8Ij60846PpQ2eZO BMKt0Z2VSulVcyTTzoQazAxnMCWIEq0MDN4AQsgVQvSGoeEcDLPmVq5wT20vFlKl fBZVU8ptmEbA7uGzSRtqI2CRXgvXJ/wyCsvBJo+v1gwiGuR4aoDOgcoSyF1DQ4mQ G/8S8aexCKoIpMR2kQoprBuAvyoSw== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrfeehgedgudeivdcutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfgh necuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd enucfjughrpefofgggkfgjfhffhffvufgtgfesthhqredtreerjeenucfhrhhomhepfdfn rghrrhihucfirghrfhhivghlugdfuceolhgrrhhrhiesghgrrhhfihgvlhguthgvtghhrd gtohhmqeenucggtffrrghtthgvrhhnpeegkeelfeelfffgkeeuhfdtleefvdduhedugfff ieetvdeihffffeeujefhvdffgeenucffohhmrghinhepghhithhhuhgsrdgtohhmpdihoh huthhusggvrdgtohhmnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghi lhhfrhhomheplhgrrhhrhiesghgrrhhfihgvlhguthgvtghhrdgtohhm X-ME-Proxy: Received: by mailuser.nyi.internal (Postfix, from userid 501) id 46140AC0073; Mon, 28 Jun 2021 17:36:35 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.5.0-alpha0-530-gd0c265785f-fm-20210616.002-gd0c26578 Mime-Version: 1.0 Message-ID: In-Reply-To: References: <43d612c0-7462-463a-9536-ed5b66d9ae1e@www.fastmail.com> Date: Mon, 28 Jun 2021 16:36:15 -0500 To: "php internals" Content-Type: text/plain;charset=utf-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [PHP-DEV] [RFC] Pipe Operator, take 2 From: larry@garfieldtech.com ("Larry Garfield") On Mon, Jun 28, 2021, at 3:42 PM, Olle H=C3=A4rstedt wrote: > 2021-06-28 22:12 GMT+02:00, Larry Garfield : > > On Mon, Jun 28, 2021, at 3:04 PM, Rowan Tommins wrote: > >> On 28/06/2021 20:25, Olle H=C3=A4rstedt wrote: > >> > Usage (ignoring the pesky undefined constant warnings ><): > >> > >> > >> Unfortunately, you can't ignore those warnings; not least because > >> they're fatal errors in PHP 8, as they frankly should have been in = PHP 3. > >> > >> You can use our current ugly callable syntax (strings and two-eleme= nt > >> arrays); you can tackle the complexity of unifying functions with > >> constants, and methods with properties (as Levi explained in the ot= her > >> thread); or you can add a dedicated callable syntax, which the PFA > >> proposal gets us with bells on. > >> > >> Regards, > > > > I think that's a pretty good summary. There's nothing that pipes or= > > partials do that you couldn't emulate in user-space today (really, s= ince 5.3 > > is you really wanted to). The emulation is just butt-ugly and slowe= r, which > > is why most people don't do it except in very specific cases or if t= hey have > > a user-space library available that makes it slightly less butt-ugly= . > > > > The purpose of PFA and pipes (and short functions, and auto-capture > > closures, and basically everything else I've been talking about all = year) is > > to make those things prettier and as fast as reasonable, which makes= using > > those techniques more natural. Once you start down that path, thoug= h, > > there's really no usable solution before you get down as far as... P= FA and > > Pipes in their current form. > > > > --Larry Garfield >=20 > The challenge is to write something that's pretty enough to be > considered idiomatic. :) The pipe operator in OCaml is defined by one > line: >=20 > let (|>) v f =3D f v >=20 > It wasn't always part of core, but eventually it was so common, it got= > included by default. Same could happen with a pipe() function in PHP, > without the pipe operator, or that the function becomes so common, a > new keyword is added instead: `pipe`. But it could probably not happen= > with a Pipe object requiring you to write ->pipe() at every step - > it's too much ceremony and boilerplate. >=20 > By the way, that's alternative 5) New keyword `pipe` to make the > warning about constants shut up in a certain scope. Plus some other > magic to allow nice chaining. ^^ >=20 > Olle "Idiomatic PHP" consists primarily of associative arrays, used in ways n= o sane person would ever use a dictionary, but the code is in a method s= o it gets called OOP even though it's barely procedural. That's not an idiom I have any interest in supporting, and have in fact = made a career out of training people out of. :-) There are *already* libraries that let you write ->pipe(). The PHP Leag= ue has one, for instance:=20 https://github.com/thephpleague/pipeline I've seen others, but they're no less ugly and offer no better migration= path into a core syntax. PHP is just not designed as a user-extensible= language. (cf, "Growing a Language" by Guy Steele, one of the best pre= sentations ever given: https://www.youtube.com/watch?v=3D_ahvzDzKdB0) Also of note, the OCaml definition there is almost exactly the same as t= he current patch; there's a request out I'm working on now to change the= implementation to ensure that the LHS is fully evaluated before the RHS= , but it's interesting to see that OCaml's version does have the out-of-= order challenge. (Although in a functional language it's semantically a= meaningless difference, by design.) Overall, I really don't like the idea of special-casing pipes to change = what symbol table gets looked up. That's just asking for edge cases to = bite us later, especially when the root problem isn't with pipes in the = first place; it's with PHP lacking either a function-reference syntax or= PFA (which gives us a function-reference syntax for free). Fix the rea= l problem, don't hack around it in what should be a very simple feature.= --Larry Garfield