Macros don’t have access to types, constants do.
How do you handle
type Foo<T> = [u8; rand(0, size_of::<T>())];?
Foo<u8> in two different contexts produce different results?
And that’s just the tip of the iceberg.
How does it integrate with traits?
How does cross-crate coherence even keep working?
Our type system is hard enough as it is to prove properties on.
How do you expect us to integrate side-effects into constant evaluation in the type system without breaking anything?
I don’t think it’s impossible, I just don’t expect you to be able to convince anyone on the Rust team to even touch this idea in 1.x, as it is, IMO, harder to get right than dependent typing, in a safe-by-default language.
EDIT: It’s actually impossible (breaks coherence), see my other responsible below.
There’s a previous discussion on the matter you might also want to look over.