Filling an array at compile time

bauss jj_1337 at live.dk
Wed Feb 9 09:07:38 UTC 2022


On Wednesday, 9 February 2022 at 08:12:52 UTC, Vindex wrote:
> Will the loop (foreach) run at compile time? How can I make it 
> work at compile time?
>
> ```
> import std.csv, std.stdio;
>
> alias Record = Tuple!(string, string, string);
>
> immutable string[][] table;
>
> shared static this() {
>     string csvText = import("file.csv");
>     foreach (record; csvReader!Record(csvText)) {
>         table ~= [record[0], record[1], record[2]];
>     }
> }
>
> void main() {
>     writeln(table):
> }
> ```

It will not run at compile-time because csvText is a runtime 
variable. It should be enum to be accessible at compile-time.

The second issue is that your foreach should probably be static 
foreach.

The third issue is how you're creating "table". The append 
operation will be executed at runtime, which means that even if 
the loop runs at compile-time then you're effectively not winning 
anything and it basically just becomes a loop-unroll manually 
done.

The solution would be to create a function that returns a string 
that is equivalent to the contents of the array you want to 
create, as if you wrote the content yourself.

And then simply using mixin to "set" the value of the table by 
calling that function.

Ex.

```
string getInt() { return "immutable a = 10;"; }

mixin(getInt);

// The variable a is accessible here ...

```


More information about the Digitalmars-d-learn mailing list