Type safe printf has been around for more than a decade, going all the way back to at least Groovy.
I linked it because its implementation is amazing comparatively and it is just one clean example of what is possible.
void Object.printf(String, Object)
and it evaluates types at runtime.Type systems are macro systems, it's just not obvious because type languages are very different from expression languages. The main "innovation" of Idris is hammering harder on this front. And in any case, the fact that most type languages are logic languages gives people with a formalist bent a warm feeling in their stomachs.