Можно ли в Rust вызывать макрос в коде макроса процедуры? - PullRequest
4 голосов
/ 21 июня 2020

Например, у меня есть атрибут макроса процедуры в блоке impl вроде этого, обычно он обрабатывает методы:

#[my_proc_macro]
impl Foo {
  pub fn bar1() {}
  pub fn bar2() {}
}

Теперь пользователь макроса может не захотеть писать эти методы, вместо этого он хочет вызвать макрос для создания этих методов, например:

#[my_proc_macro]
impl Foo {
  generate_methods!();
}

Теперь в my_proc_macro будут передаваться токены вызова макроса, а не токены результата вызова макроса.

My вопрос: можно ли развернуть generate_methods!() внутрь my_proc_macro, и работать с созданными методами?

1 Ответ

1 голос
/ 21 июня 2020

К сожалению, в настоящее время (Rust 1.44.1) невозможно .

Однако это известная проблема уже довольно давно. Поисковый запрос - «нетерпеливое расширение макроса». Существует этот открытый RF C, который был запущен в феврале 2018 года:

Предоставьте API для процедурных макросов, чтобы выбрать активное расширение. Это позволит:

  • Разрешить процедурным и декларативным макросам обрабатывать вызовы нерасширенных макросов, которые передаются в качестве входных данных,
  • Разрешить макросам доступ к результатам вызовов макросов, которые они сами создают,
  • Разрешить использование макросов там, где это запрещено грамматикой.

Итак, люди работают над этим, но я бы не стал рассчитывать на получение этой функции в ближайшее время. В конце концов, это непростая проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...