On Friday, 4 December 2015 at 14:07:01 UTC, Jacob Carlborg wrote:
On 2015-12-04 11:42, Marc Schütz wrote:

I'd support that, too.

I suggest to make the struct name optional:

     struct S { int a, b; }
     struct T { string a, b; }
     void foo(S s);
     void foo(T t);

     foo({b: 1, a: 2});  // foo(S(2, 1));
     foo({a: "bla"});    // foo(T("bla", null));

Then we can add some syntax sugar to leave out the braces, too:

     void bar(int a, T t)
     bar(42, a: "bla", b: "xyz");

This effectively gives us strongly typed named arguments, without making the names part of the function signature, which Walter objected to the
last time something like this was proposed.

I've been thinking along the same lines as well and would really like to see that feature. Wondering if it could work with opDispatch as well to swallow unrecognized fields.

But I do see a problem, which I'm guessing Walter would point out as well. It might/will complicate the overloading rules. What if "a" and "b" in T would be integers instead. I think that would be ambiguous.

Right, this would need to be rejected. When the compiler sees such syntax, it would need to get a list of struct types allowed in the current position, and try to construct each of them with the given arguments. If there isn't exactly one match, it is rejected. This way, there is no change to the overloading rules themselves, it's just a rule to determine the type of the {key: value, ...} expression. After that, overloading works as usual.

Reply via email to