Manipulating variables without evaluating them
Dadoum
dadoum at protonmail.com
Sun May 7 17:11:52 UTC 2023
Hello,
I am currently making a wrapper around libplist in D, and to get
a good syntax I first thought about making a `pl` function with
bunch of overloads allowing to convert strings, integers,
booleans into the corresponding `Plist` type. It is working but
the problem here is that associative array literals are not
preserving order (they are immediately hashed, and so all the
keys are in a random order).
To overcome that, I create a template `plistDict` as such:
```d
template plistDict(alias U) {
PlistDict pl() {
auto dict = new PlistDict();
static foreach (elem; dict) {
dict[elem.key] = elem.value;
}
return dict;
}
}
```
The `static foreach` ensures everything is running at compile
time, and so no hash should mess with the keys. But the problem
here is that it tries to evaluate at compile time the value of
each entry in the associative array (what it can't do since it's
a wrapper around a C library!).
The same kind of issue can be encountered in this small code
snippet:
```d
string crashingFunction() {
assert(!__ctfe);
return "OK";
}
template macroLikeTemplate(alias U) {
string macroLikeTemplate() {
return "" ~ U;
}
}
void main()
{
macroLikeTemplate!(crashingFunction());
}
```
Here, the function is evaluated before the element is passed to
the template, and is failing (here because of an assert, but we
can imagine something that would fail only at compile-time like a
C call), while the substitution could just work fine if it wasn't
evaluated before hand.
Is there any way to make this work?
More information about the Digitalmars-d
mailing list