Mixin programming foreach

eXodiquas exodiquas at gmail.com
Mon Sep 27 16:23:50 UTC 2021


Howdy ho everyone,

I found this forum very helpful for my (maybe) stupid questions, 
so I give it a try again because I don't understand what's 
happening here.

First of all, I'm not exactly sure what this code here, from the 
documentation at https://dlang.org/articles/mixin.html, does:

```d
template GenStruct(string Name, string M1)
{
     const char[] GenStruct = "struct " ~ Name ~ "{ int " ~ M1 ~ 
"; }";
}

mixin(GenStruct!("Foo", "bar"));
```

In my understanding we create a template called `GenStruct` with 
compile time arguments `Name` and `M1`. We then create the 
`char[] GenStruct` which holds the source code for the `struct`. 
Afterwards we do the `mixin`call and create the source code 
during compile time to have it ready to go. But I don't 
understand why the `char[] GenStruct` is there. Is this the name 
of the `mixin` or is the `template GenStruct` the name of what we 
pass to the `mixin`? Can we create more than one const char[] in 
one `template` scope and what would it do if we could? So I'm a 
bit confused here.

But nevertheless, I copied the code and changed it a bit to 
something like this:

```d
template Vector(int dimension) {
   string cps = "";
   foreach(d; 0..dimension) {
     cps ~= "x" ~ d ~ " = 0;\n";
   }
   const char[] Vector = "struct Vector {\n" ~ dimension.to!string 
~ cps ~ "}";
}
```
In my head a call to `mixin(Vector!5)` should result in something 
like this:

```d
struct Vector5 {
   int x0;
   int x1;
   int x2;
   int x3;
   int x4;
}
```
But it does not compile because `Error: declaration expected, not 
foreach` which I understand as "foreach is not possible during 
compile time", whereas I don't see any problem with compile time 
availability of anything in this template. Obviously I don't 
understand something here, so it would be awesome if someone 
could help me out here. :P

And as a final question. Let's say the above problems are all 
solved and I construct such a template. How could I build 
functions that take any of those `Vector`s as an argument?
For example I want to add two of those, the function would look 
something like this, or am I lost again?

```d
Vector!T add(Vector!T lhs, Vector!T rhs) {
   return ?;
}
```
How could I iterate over all components if such a `Vector`?

I hope I am not on the completely wrong track to tackle this 
problem.

Thanks in advance. :)

eXodiquas


More information about the Digitalmars-d-learn mailing list