I suggest the introduction of macro compile time variables, prefixed with the sigil $. These can only hold compile time values and are evaluated top down.
This is a variant of what already exists in C, but in a syntactically more friendly way.
For example this would be ok:
macro swap(a, b) {
$x = typeof(a);
static_assert(typeof(b) == $x);
$x temp = a;
a = b;
b = a;
}
The example above is a bit contrived as in the above example we could simply have:
macro swap(a, b) {
static_assert(typeof(b) == typeof(b));
typeof(a) temp = a;
a = b;
b = a;
}
But still, it serves as an example on how to use it.