On Mon, Aug 26, 2024, 12:02 PM Larry Garfield <la...@garfieldtech.com>
wrote:

> On Mon, Aug 26, 2024, at 6:36 AM, Jakob Givoni wrote:
> > On Mon, Aug 26, 2024 at 12:49 PM Rowan Tommins [IMSoP]
> > <imsop....@rwec.co.uk> wrote:
> >> On Mon, 26 Aug 2024, at 10:14, Bilge wrote:
> >> > You're absolutely right, I would be interested to see any viable
> patch
> >> > that effectively implements a set of restrictions on how `default`
> may
> >> > be used. Requesting it be done at the parser level was not meant as a
> >> > gotcha, that's just how I (with my lack of experience) would have
> >> > approached it, but certainly trapping cases in the compiler is
> equally,
> >> > if not more valid and/or practical.
> >>
> >> Another approach that occurred to me was in the executor: rather than
> evaluating to the default value immediately, "default" could resolve to a
> special value, essentially wrapping the reflection parameter info. Then
> when the function is actually called, it would be "unboxed" and the actual
> value fetched, but use in any other context would be a type error.
> >>
> >> That would allow arbitrarily complex expressions to resolve to
> "default", but not perform any operations on it - a bit like propagating
> sqrt(-1) through an engineering formula where you know it will be cancelled
> out eventually.
> >>
> >
> > I 100% agree with this.
> > "default" should not evaluate to a value before sending it as an
> > argument to the function or method.
> > I understand from what the RFC author wrote a while ago that doing so
> > (evaluating to the actual default value using reflection) was the
> > easier and perhaps only viable way at the moment, but if that's the
> > case, I don't think the value of this RFC justifies doing something
> > like that, which to me seems like a hack.
> >
> > For those already expressing interest in being able to modify a binary
> > flag default parameter using this "trick", I still don't think it
> > justifies this RFC. In my opinion, functions that accept multiple
> > arbitrary options by compressing them into a binary flag have a badly
> > designed interface to begin with.
> >
> > So, my 10c: Make "default" a pure keyword / immutable value if
> > possible, or reconsider whether this feature is really worth the fuss.
>
> The problem here is that `foo(default | ADDITIONAL_FLAG)` is so far the
> most compelling use case I've seen for this feature.  It's really one of
> only two I see myself possibly using, frankly.  So a limitation that would
> disallow that pattern would render the RFC almost useless.
>
> The other compelling case would be the rare occasions where today you'd do
> something like this:
>
> if ($user_provided_value) {
>   foo($beep, $user_provided_value);
> } else {
>   foo($beep);
> }
>
> Which this RFC would allow to be collapsed into
>
> foo($beep, $user_provided_value ?: default);
>
> So far those are the two use cases I can realistically see being helpful,
> and I acknowledge both are.


I can see a few others:

- string concatenation. I might want to prepend or append a string to a
default.

- fractional or multiplicative application, e.g. for durations/timeouts.
These might require testing for non-zero first as well.

- decorating a default instance (e.g. to lazily create a proxy without
knowing the default implementation used for an argument hinted against an
interface)

And these are just off the top of my head. I could likely identify more
with a short bit of time looking through some libraries I regularly use.


I recognize that "limiting the allowed expression structures arbitrarily is
> way harder than it sounds" is a valid argument as well.  At the same time,
> John C has offered some valid examples of cases where it would open up
> additional footguns, and we want to minimize those in general.  Those
> shouldn't be ignored, either.
>

IF it's possible to accomplish, I think it's better to identify the
"leaving this open will create WTF situations" than to prematurely lock
_everything_ down up front.

There's been a few good lists about the cool things this could enable,
demonstrating the value; maybe now we should focus on the "we absolutely
shouldn't enable" pieces to allow for broader consensus.


> At the moment I'm on the fence on this RFC.  I could go either way right
> now, so I'm watching to see how it develops.
>
> --Larry Garfield
>

Reply via email to