OT: Tuple Syntax and Placeholders (Re: First Draft: Tuple Unpacking Syntax)

Nick Treleaven nick at geany.org
Sat Aug 2 09:53:11 UTC 2025


On Friday, 1 August 2025 at 10:36:37 UTC, Nick Treleaven wrote:
> On Friday, 1 August 2025 at 10:08:09 UTC, Nick Treleaven wrote:
> Sorry, wrong code above.
> ```d
>     T a, b;
>     alias seq = AliasSeq!(a, b);
>     // auto (x, y) = seq;
>     auto x = seq[0];
>     auto y = seq[1];
> ```
>
>> `a[0]` and `a[1]` are not moved by the lowered code.

So obviously `a` and `b` are lvalues and shouldn't be moved, 
sorry. Other cases:

```d
import std;

struct S
{
     int i;
     this(ref S s) { writeln("copy", s.i); }
}

void main()
{
     writeln("rvalue");
     auto a = tuple(S(1))[0]; // copy, not move!
     writeln("lvalue");
     auto t = tuple(S(2));
     writeln("index");
     auto b = t[0]; // copy, OK
     writeln("seq");
     auto c = AliasSeq!(S(3))[0]; // move, OK
}
```
So the DIP should move when unpacking into `c`. For `a`, I think 
we would need tuple literals to avoid a copy.


More information about the dip.development mailing list