mixin identifiers concept
Quirin Schroll
qs.il.paperinik at gmail.com
Mon Feb 7 10:49:13 UTC 2022
On Monday, 31 January 2022 at 07:19:49 UTC, bauss wrote:
> On Saturday, 29 January 2022 at 21:24:09 UTC, mesni wrote:
>> ```d
>> 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.
>
> ```d
> 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:
>
> ```d
> 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:
```diff
Identifier:
IdentifierStart
IdentifierStart IdentifierChars
+ MixinExpression
```
So, you'd do
```d
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;
}
```
More information about the Digitalmars-d
mailing list