Multiple return values...

Timon Gehr timon.gehr at gmx.ch
Fri Mar 9 07:57:02 PST 2012


On 03/09/2012 04:38 PM, Manu wrote:
> On 9 March 2012 16:27, Timon Gehr <timon.gehr at gmx.ch
> <mailto:timon.gehr at gmx.ch>> wrote:
>
>     On 03/09/2012 01:23 AM, Manu wrote:
>
>         I can imagine syntax using parentheses, but I don't think I'm
>         qualified
>         to propose a robust syntax, I don't know enough about the finer
>         details
>         of the grammar.
>         Perhaps if other people agree with me, they could present some
>         creative
>         solutions to the syntax?
>
>         I imagine something like:
>         auto (x, y) = func(); // specify auto for all results?
>         float (x, y) = func(); // specify explicit type for all results?
>         (int x, float y) = func; // explicitly type each result?
>
>
>     This works, and Kenji Hara has already implemented appropriate
>     parser extensions.
>
>         int x; ... (x, float y) = func(); // assign to predeclared
>         variable(/s)?
>         (x, , z) = func(); // ignore the second result value
>         (elimination of the
>
>         second result's code path)
>
>
>     Those two would work, but (x,y) = func(); conflicts with the comma
>     operator. (I'd prefer (,) to be a tuple constructor though.)
>
>
> You think so? Within that context, I would think the coma could be
> reinterpreted however it likes. The usual use of the coma operator makes
> no sense in this context?

void main(){
     int a,b;
     (a,b)=2;
     assert(a==0);
     assert(b==2);
}

>
> These last 2 examples are what I see as being the most important part,
> and the precise reason that it SHOULDN'T be a tuple.

You are probably confusing the tuple concept with a Phobos Tuple.

> The ability to
> directly assign results to explicit (existing) variables, and to ignore
> some/all of the return values, is a fundamental feature of the /concept/
> of return values universally.
> I see this as basically the whole point.
> Another example: (someStruct.x, y, , int err) = func();
> In this example, I assign the x result to a struct, y assigns to some
> existing local, we ignore z because we can (visually states our intent,
> would be hidden through use of a tuple), and we declare an int to
> capture a potential error in place.

This is simple pattern matching.

> If we were abusing the tuple syntax, we would need additional lines
> following the call to assign the rvalues out to their appropriate
> places, which is unnecessary spaghetti.

What you propose is tuple syntax.




More information about the Digitalmars-d mailing list