В целом я согласен с Серёгой. Для меня макросы - это попа-боль в Rust. Их там даже два типа:
- декларативные - можно сравнить с макросами для C, только они работают на уровне токенов парсера
- процедурные - это по сути плагин для компилятора написанный на самом Rust, который имеет информацию не только о токенах, но и о типах данных и им можно делать крутые штуки.
И вот я такой радостный пришёл в Rust - наконец-то IDE будет мне давать исчерпывающую информацию о всех типах данных, всякие автокмплиты и GoTo Definition. Но хер бы там - макросы, блядь, во все поля. И если с декларативными макросами кое как научились в Idea разбираться. Парсят их с некоторыми ограничениями на глубину вложенности. То вот с процедурными всё достаточно печально - это же по сути нативный код, который несколько сыкотно запускать в IDE.
При этом ни там ни там нет Goto Definition. А глазами парсить эти макросы - сомнительное удовольствие. Есть утилитка, которая может тебе весь проект или один модуль "раскрыть" и выплюнуть этот код в консоль - ищи нужный тебе кусок кода сам.
Про макросы а-ля процедурные макросы в Расте (или там Babel Transformы) у меня такая цепочка мыслей:
У вас есть код который работает с синтаксическим деревом. Это структура данных. Работать со структурами данных без литералов структур данных неудобно. Добавляем литералы стуктуры данных синтаксического дерева - появляется что-то вроде S-expressions. А когда они есть, почему бы сразу на них не писать код? Поздравляю, теперь у вас Лисп