Why does this mixin fail to compile?
ryuukk_
ryuukk.dev at gmail.com
Tue Jul 2 07:23:42 UTC 2024
On Monday, 1 July 2024 at 21:43:02 UTC, Dennis wrote:
> On Monday, 1 July 2024 at 13:00:55 UTC, ryuukk_ wrote:
>> please stick to what i wrote, i don't want string
>> concatenation, i provide a reduced example from my project,
>> everything should be a single template block, no extra
>> functions other than the append() one
>
> Mixin templates are a declaration scope, not a function scope,
> so they aren't necessarily analyzed top to bottom. This is why
> allowing partial string mixins would be complicated, consider
> this example:
>
> ```D
> mixin template implement()
> {
> mixin("struct " ~ str);
>
> mixin("{");
>
> immutable string str = "T";
>
> mixin("}");
> }
> ```
>
> It's not obvious how this should be compiled, and this is
> before throwing `static if` and `static foreach` in the mix! If
> you want to procedurally build a type in sequential steps,
> you'll have to do that in a function scope.
>
> If your concern is that such a function would add needless code
> generation, you can use an immediately invoked anonymous
> function like so:
>
> ```D
> mixin template implement(string typeName, string[] members)
> {
> mixin(() {
> string result = "struct " ~ typeName ~ " {";
> foreach (name; members)
> {
> result ~= "int " ~ name ~ ";";
> }
> result ~= "}";
> return result;
> } ());
> }
>
> mixin implement!("S", ["x", "y", "z"]);
>
> immutable s = S(x: 3, y: 5, z: 7);
> ```
>
> You can use your fixed size array append function to try and
> improve CTFE performance, but I'd start with straightforward
> concatenation, and see if it's actually too slow. In that case,
> maybe see if you can reduce it to a self-contained example and
> post it on bugzilla as a performance bug.
I said it 2 times already, i don't want string concatenation,
i'll benchmark later, but not right now, right now i'm looking
for a functioning code without string concatenation
More information about the Digitalmars-d-learn
mailing list