Re: [RFC] Default expression

From: Date: Sun, 25 Aug 2024 14:08:35 +0000
Subject: Re: [RFC] Default expression
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-125211@lists.php.net to get a copy of this message
On Sun, Aug 25, 2024, at 15:35, Larry Garfield wrote: > On Sat, Aug 24, 2024, at 11:49 AM, Bilge wrote: > > Hi gang, > > > > New RFC just dropped: > > https://wiki.php.net/rfc/default_expression. I > > think some of you might enjoy this one. Hit me with any feedback. > > > > This one already comes complete with working implementation that I've > > been cooking for a little while. Considering I don't know C or PHP > > internals, one might think implementing this feature would be > > prohibitively difficult, but considering the amount of help and guidance > > I received from Ilija, Bob and others, it would be truer to say it would > > have been more difficult to fail! Huge thanks to them. > > > > Cheers, > > Bilge > > I am still not fully sold on this, but I like it a lot better than the previous attempt at a > default keyword. It's good that you mention named arguments, as those do replace like 95% of > the use cases for "put default here" in potential function calls, and the ones it > doesn't, you call out explicitly as the justification for this RFC. > > The approach here seems reasonable overall. The mental model I have from the RFC is > "yoink the default value out of the function, drop it into this expression embedded in the > function call, and let the chips fall where they may." Is that about accurate? > > My main holdup is the need. I... can't recall ever having a situation where this is > something I needed. Some of the examples show valid use cases (eg, the "default plus this > binary flag" example), but again, I've never actually run into that myself in practice. Potentially the most useful place would be in attributes. Take crell\serde (:p) for instance: #[SequenceField(implodeOn: default . ' ', joinOn: ' ' . default . ' ')] Where you may just want it to be a little more readable, but aren't interested in the default implosion. In attributes, it has to be a static expression and I think this passes that test? At least that is one place I would find most useful. Then there are things like the example I gave before, where you need to call some library code as library code and pass through the intentions. It also gets us one step closer to something like these shenanigans: function configureSerializer(Serde $serializer = new SerdeCommon(formatters: default as $formatters)); Where we can call configureSerializer(formatters: new JsonStreamFormatter()). Some pretty interesting stuff. > > My other concern is the list of supported expression types. I understand how the > implementation would naturally make all of those syntactically valid, but it seems many of them, if > not most, are semantically nonsensical. Eg, default > 1 would > take a presumably numeric default value and output a boolean, which should really never be type > compatible with the function being called. (A param type of int|bool is a code smell at best, and a > fatal waiting to happen at worst.) In practice, I think a majority of those expressions would be > logically nonsensical, so I wonder if it would be better to only allow a few reasonable ones and > block the others, to keep people from thinking nonsensical code would do something useful. I'm reasonably certain you can write nonsensical PHP without this feature. I don't think we should be the nanny of developers. — Rob

« previous php.internals (#125211) next »