On Sunday, 25 July 2021 at 05:10:32 UTC, someone wrote:
/// implementation: however, would it be possible to
dynamically‐load the following enums from a file at
compilation‐time ?
public immutable enum structureLocations = [
r"BUE"d : typeLocation(r"arg"d, r"Buenos Aires"d, r"ART"d),
r"GRU"d : typeLocation(r"bra"d, r"São Paulo"d, r"BRT"d),
r"HHN"d : typeLocation(r"deu"d, r"Frankfurt am Main"d,
r"CET"d),
r"LHR"d : typeLocation(r"gbr"d, r"London"d, r"UTC"d),
r"NYC"d : typeLocation(r"usa"d, r"New York"d, r"EST"d)
];
```
Error: `_aaRange` cannot be interpreted at compile time, because
it has no available source code
```
Yep, seems that's not available.
What you're doing with `immutable enum structureLocations` is
creating a manifest constant, i.e. your AA initialization is
copy-pasted into each use of it, which means your program is
rebuilding this AA at runtime every time it comes up. You
probably got to this point as a bare `immutable
structureLocations` errored out to the non-constant expression.
You should be able to use a shared static module initializer to
initialize an immutable AA,
https://dlang.org/spec/module.html#staticorder , but although
I've seen examples of simple string[string] initialization, it
seems to be very hard to get more complex AAs past the
std.array/std.exception tools.
So here's something you can do:
```d
__gshared const dstring[][dstring] structureExchanges;
__gshared const dstring[dstring] exchangeStructures;
shared static this() {
import std.string, std.algorithm;
dstring[][dstring] exchanges;
// could easily load this from a file
" B3: B3 formerly Bolsa de Valores de São Paulo (aka
BOVESPA)
BCBA: Bolsa de Comercio de Buenos Aires
LSE: London Stock Exchange
NASDAQ: National Association of Securities Dealers
Automated Quotations
NYSE: New York Stock Exchange
XETRA: Deutsche Börse
"d.strip.splitLines.map!strip.each!((dstring exch) {
const pair = exch.split(": ");
exchanges[pair[0]] = [pair[1], "some other values"d];
});
structureExchanges = exchanges;
dstring[dstring] structures;
foreach (k, v; exchanges)
structures[v[0]] = k;
exchangeStructures = structures;
}
```
std.array.assocArray might also come in handy.