Writing a (dis-)assembler for 8-bit code in D - blog posts
Dukc
ajieskola at gmail.com
Tue Apr 20 16:30:56 UTC 2021
On Tuesday, 20 April 2021 at 15:37:25 UTC, Brian wrote:
> I suppose what I want to do is traverse the compiler's
> transformation of the mixin. The mixin page suggests it
> performs that work at semantic evaluation time.
>
> ~Brian
I try to explain how it does that.
First off, as the article says, a mixin must always expand to
either a complete statement/declaration, or to an expression.
This let's the compiler to complete the grammar pass (of stuff
outside the mixin) before the semantic analysis, without needing
to worry about the content of the mixin. This is why `mixin("{")`
won't work - the grammar pass would have to analyze what is in
the string to understand that.
Secondly, a mixin can accept any string available at compile
time. D has a compile time function execution engine, that is
used if a result of a function is needed at compile time. This is
the case for `mixin` arguments, but it's not the only thing.
Behold:
```D
import std;
//a regular function, callable at both runtime and compile time
string makeSymbol(const char c){return "in" ~ c;}
//a template
alias Type(T) = T;
//compile-time constant that behaves like a variable
enum intStr = makeSymbol('t');
void main()
{
//same as int x = 15;
//all work to determine the type done by CTFE engine at
semantic pass
Type!(mixin(intStr)) x = 15;
x += 10;
x.writeln;
}
```
More information about the Digitalmars-d
mailing list