On Mon, May 17, 2021 at 5:47 PM Alexandru Pătrănescu <dreal...@gmail.com> wrote:
> > On Mon, May 17, 2021 at 6:36 PM Guilliam Xavier <guilliam.xav...@gmail.com> > wrote: > >> On Mon, May 17, 2021 at 5:01 PM Levi Morrison < >> levi.morri...@datadoghq.com> >> wrote: >> >> > Joe Watkins has successfully worked out some bugs that also enable >> > more powerful behavior. Thanks to Nikita and any others who worked >> > with Joe on fixing these issues and reviewing the PR. >> > >> > The short of it is that re-ordering parameters when using named >> > placeholders is now technically possible. We will send an update when >> > the RFC and implementation are ready for re-review. >> > >> >> That's great news! >> >> By the way, I forgot to add that another syntax might also be clearer when >> binding a value to a named parameter, e.g.: >> >> ``` >> function f($a, $b, $c, $d, $e) {/*...*/} >> >> /* We want to bind value 4 to param "d" */ >> >> // with current syntax: >> $p = f(?, d: 4); /* or f(?, ?, ?, 4) */ >> >> // with another hypothetical syntax: >> $p = *f(d: 4); >> ``` >> >> Anyway, looking forward to your update =) >> >> Thanks, >> >> -- >> Guilliam Xavier >> > > Hey Guilliam, > > adding a special character like * or ? before the function name is > not going to work. > It might look good for *f() but it has the same issues as casting. > > You should be able to have with the current version a code like > $actionGenerator->getDriveAction()('home', ?) > You can't really put the * or ? before the function name here. > > Maybe having it just before the parenthesis would work. > > Regards, > Alex > > > > Hey Alex, I was thinking of a (special) new unary [prefix] operator (e.g. `*` which currently only exists as binary) with a higher precedence than `()` (if that makes sense), which indeed means that e.g. `*f(1)(2)` would be like current `f(1, ?)(2)`, and `f(1)(2, ?)` would require wrapping as `*(f(1))(2)`. A lower precedence would require wrapping as `(*f)(1)` for the simple case (i.e. most of the time), which moreover would probably be problematic if you have both a `function f` and a `const f`. Just before the affected `(` might also work indeed, but with another symbol, as `f(1)*(2)` [and `f*(1)`] already means `f(1) * 2` [and `f * 1`]. Maybe `!`, `@` or `~` would be unambiguous at that position? (For both, there's also the possibility of choosing not a symbol but a keyword...) Alternatively, `f(..., d: 4)` or probably rather `f(d: 4, ...)` would arguably still be clearer than the current `f(?, d: 4)`, but still wouldn't really solve the "weirdness" of `noParam(...)` and `threeParams(1, 2, 3, ...)`. Sorry, I didn't intend to diverge so much. The gist is that I (too) don't like the current "duality" of `?`. PS: when I write "current" I really mean "in the current state of the RFC". Regards, -- Guilliam Xavier