mixin issue
Paul Backus
snarwin at gmail.com
Wed Nov 29 15:54:34 UTC 2023
On Wednesday, 29 November 2023 at 13:31:14 UTC, DLearner wrote:
> ```
> Error: found `End of File` when expecting `;` following
> statement
> ```
>
> If an extra ; is added:
> ```
> }(` ~ strStartPtr ~ `,` ~ strPLPtr ~ `);`;
> ```
>
> it works but doesn't seem correct.
This is an annoying limitation of the D compiler.
The root of the problem is that there is an ambiguity in D's
grammar. When the compiler sees
mixin(whatever);
...it cannot tell whether it's supposed to be a [Mixin
Statement][1], or an [Expression Statement][2] that contains a
[Mixin Expression][3].
If it's a Mixin Statement, then there should be a semicolon
inside the mixin. If it's an Expression Statement with a Mixin
Expression, then there shouldn't be a semicolon inside the mixin.
To resolve this ambiguity, the compiler (currently) *assumes*
that it's always a Mixin Statement, which means that it will
always require a semicolon inside the mixin.
As a result, it is impossible to write a string mixin that can be
used as both a statement and an expression.
If you have an expression mixin and you would like to use it as a
statement, you can work around this limitation by adding
`cast(void)` in front of the mixin:
cast(void) mixin(whatever);
This forces the compiler to parse the line as an Expression
Statement containing a [Cast Expression][4], but does not
otherwise change the meaning of the code.
[1]: https://dlang.org/spec/statement.html#mixin-statement
[2]: https://dlang.org/spec/statement.html#expression-statement
[3]: https://dlang.org/spec/expression.html#mixin_expressions
[4]: https://dlang.org/spec/expression.html#cast_expressions
More information about the Digitalmars-d-learn
mailing list