Nim позволяет легко писать макросы. В этом и проблема.
Прежде чем браться за macro, проверь инструменты подешевле. const вычисляется во время компиляции той же VM, что исполняет макросы, так что таблица поиска, построенная обычной proc, это просто const table = buildTable(). Блок static: выполняет код при компиляции и ничего не генерирует. Проверки конфигурации, размеров, форматов строк. Обычные proc, вызванные пораньше.
Дальше шаблоны. Простая подстановка, никакого обхода AST. Покрывает почти все желания завести маленький DSL.
Настоящему макросу остаётся синтаксис, который эти три не выражают. Но и тогда макрос только переставляет узлы. Логика, которой не нужен NimNode, живёт в обычных proc, и их я тестирую во время выполнения, как всё остальное.
Маленький макрос, большая proc. Сообщения об ошибках остаются читаемыми.