Building domain-specific languages with multi-language macros