Добрый день.
Пишу бэк и параллельно осваиваю макросы. Понял, что декларативных мне мало, ибо существующие разрешённые токены порой не позволяют порой писать так, как хочется, да и возможность парсинга процмакросы иногда дают иные.
Попробовал написать процедурный. Минусов значительное количество:
- Cannot find declaration to go to
при тыках на сам макрос/создаваемые им вещи
- полное отсутствие этих вещей в скоупе автокомплита что у Inteleji Rust, что у RA. Декларативные хотя бы не надо помнить наизусть.
- сложнее их изучить.
- код уходит в другой крейт, сложнее поддерживать актуальность
Плюсы, собственно, тоже понятные: вообще любой текст можно внутрь пихать, ибо парсинг идёт вручную.
Вот из этого и выходит вопрос - стоит связываться с написанием процмакросов? Или оно того не стоит, поддержка существующими анализаторами будет нескоро, если вообще будет, и компилятор оно ломает прилично, а ошибки прячутся далеко.
Хотелось бы услышать "за" и "против" от тех, кто уже давно пишет.
Если да - подмогите ресурсами по процмакросам и парсингу, например, как реализовать переменное количество аргументов и так далее. Пока изучал function-like по экзамплам из syn
(пример с lazy_static!).
Пишу процмакросы давно и много. В основном дерайвы и аттрибуты. Не представляю как без них вообще жить, ибо любой нетривиальный код абстракций закончится тонной бойлерплейта, который проц-макросы позволяют красиво прятать оставляя простой и понятный декларативный код. Все минусы с автокомплитами и дополнительным крейтом в workspace того стоят.
Проблем с написанием вроде нет. Такой же Rust-код как и остальное, только парсящий/формирующий синтаксис.
Каких-то особенных материалов для освоения не припомню. У меня происходило так: есть понимание что нужно запихнуть под кодогенерацию - берём в зубы proc-macro2
, syn
, quote
вместе с их докой - и вперёд.