This needs to be fixed

Nick Treleaven nick at geany.org
Wed Aug 28 09:44:44 UTC 2024


On Sunday, 25 August 2024 at 05:07:43 UTC, Manu wrote:
> Like, from my example above, what even IS `s.tupleof`? It's 
> some kind of
> list of what kind of thing? Direct symbol references to members 
> of a live
> instance?

It's a symbol sequence of references to fields.

```d
import std;

struct S
{
     int i;
     char c;
}

void main()
{
     S s = {2, 'c'};
     ref si = s.i;
     ref sc = s.c;
     alias tupleof = AliasSeq!(si, sc); // same as s.tupleof
     tupleof[0]++;
     s.writeln();
     assert(s.i == 3);

     // this actually works
     alias a = tupleof[0];
     a++;
     assert(s.i == 4);
}
```

So `alias e = s.tupleof[0];` could be made to work.

See also: https://dlang.org/spec/template.html#lvalue-sequences.

BTW I'd like to make sequences a separate spec page from 
templates really.

> If s.tupleof can populate a list with that kind of thing, why 
> doesn't this
> work:
>
> struct S
> {
>   int x, y;
> }
>
> struct T
> {
>   S s;
>   int i;
>
>   alias a = i; // works
>   alias b = s.x; // Doesn't work? Why?
> }

`a` is a symbol alias. `b` would be an expression if it did what 
you want. Instead it's the same as `S.x`, which needs an instance 
of S to use it at runtime.

However, you could now use `ref b = s.x;` instead inside a method 
of T.

...

> alias b = s.tupleof[0]; // this emits a surprising error 
> message:
>
> error : alias `b` cannot alias an expression `AliasSeq!(s.x, 
> s.y)[0]`
> So, that 'list' I mention; does this error message imply that 
> this list given by `tupleof` is an AliasSeq? What exactly IS an 
> AliasSeq? What is the actual set of things that it can hold?

Symbols (declarations) and compile-time values. S.x is a 
declaration, s.x is a runtime value.

`tupleof` is a symbol sequence of implicit ref declarations.




More information about the Digitalmars-d mailing list