On Monday, 31 January 2022 at 07:19:49 UTC, bauss wrote:
> On Saturday, 29 January 2022 at 21:24:09 UTC, mesni wrote:
> static foreach(name; ["boo", "foo"]){
string file_#name = readText(name~".txt");
string file_#name#_info = readText(name~".meta");
auto ##name = file_#name#_info.parseInfoFile;
}
writeln(file_boo);
writeln(boo);
writeln(file_foo_info);
To make it easier to read/write code in D, I would introduce new mixins. These mixins can only represent identifiers. Also, the advantage of such mixins, the parser and semantic analysis will be able to detect some errors before the code is completely "opened". Also, I think they can speed up compilation.
I believe a DIP would be necessary, but to be honest I don't see a reason for this.
You can just do this which isn't really much less readable.
static foreach (name; ["boo", "foo"])
{
mixin(`string file_%1$s = readText("%1$s.txt");`.format(name));
}
writeln(file_boo);
writeln(file_foo);
And if D ever gets interpolated strings then the whole format can be removed and it could probably become something like this:
static foreach (name; ["boo", "foo"])
{
mixin(i`string file_$name = readText("$name.txt");`);
}
writeln(file_boo);
writeln(file_foo);
So personally I don't see a reason for your suggestion to be added.
I think it's just going to introduce more complexity than it's worth.
One big disadvantage interpolated strings have is you have to put the full declaration in a string. No big deal for a statement, but if the name of a function depends on compile-time stuff, the whole function is a string.
A much easier solution to this is allowing mixin()
as an Identifier
in general:
Identifier:
IdentifierStart
IdentifierStart IdentifierChars
+ MixinExpression
So, you'd do
static foreach(name; ["boo", "foo"])
{
enum string file_name_info = "file_" ~ name ~ "_info";
string mixin("file_", name) = readText(name ~ ".txt");
string mixin(file_name_info) = readText(name ~ ".meta");
auto mixin(name) = mixin(file_name_info).parseInfoFile;
}