Хочется странного, то есть макросов. Для начала — хотя бы самые примитивные, но хотелось бы честные — так что бы потом можно было потом извлечь из этого нечто большее.
По идее, для компилируемого языка макросы должны выглядеть как-то так:
1) В процессе разбора AST мы разбираем макрос — соответственно, у нас должны быть некие токены, которые определяют начало и конец макроса. Ну или хотя бы начало, конец может быть каким-то повторно используемым токеном.
2) Определение макроса может быть, наверное, распарсено тем же самым разборщиком, который разбирает и основной синтаксис.
3) Насколько я себе представляю, результатом разбора определения макроса является построение динамического разборщика
4) В месте, где макрос используется (вероятно, тоже надо отбить какими-то спец. токенами) — поток от начала макры до конца скармливается построенному разборщику, интерпретируется и результат интепретации применяется к некоему узлу AST.
Правильно ли это понимание, и есть ли какие-то более простые подходы? Серьезная засада мне тут видится с тем, что, например, сейчас очень многие проверки — вплоть до типизации некоторых моментов — делаются в парсере, совсем декларативно. Возможность делать произвольные преобразования над AST приведет к дополнительному анализу уже после раскрытия макросов, что может быть нетривиально, и вообще время компиляции никак не сократит.
Конкретно сейчас, хочется научиться определять именованные константы времени компиляции — но по идее, любых типов — так что, что бы делать константные, например, туплы — уже нужны честные макросы.
Где бы посмотреть? Кроме немерле есть что нибудь статическое, вменяемое и с макрами (не надо только про с++) ?