Size: a a a

Rust — русскоговорящее сообществo

2020 April 09

P

Pavel in Rust — русскоговорящее сообществo
она у тебя уже есть
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
У меня есть структура A, которую я хочу создавать макросом a!().
Очевидно, чтобы пользоваться макросом нужно, чтобы в доступе была структура.
В крейте, в котором располагается структура, я хочу мочь пользоваться этим макросом.
источник

P

Pavel in Rust — русскоговорящее сообществo
Emmanuel Goldstein
У меня есть структура A, которую я хочу создавать макросом a!().
Очевидно, чтобы пользоваться макросом нужно, чтобы в доступе была структура.
В крейте, в котором располагается структура, я хочу мочь пользоваться этим макросом.
создать структуру как тип, или создать экземпляр структуры и заполнить его поля?
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Pavel
создать структуру как тип, или создать экземпляр структуры и заполнить его поля?
Второе
источник

P

Pavel in Rust — русскоговорящее сообществo
вроде для этого хватит обычного macro_rules!
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Pavel
вроде для этого хватит обычного macro_rules!
Мне нужно в процессе перевернуть список
источник

P

Pavel in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Мне нужно в процессе перевернуть список
ну, вызови переворот списка в коде создающем инстанс структуры
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Pavel
ну, вызови переворот списка в коде создающем инстанс структуры
Не в этом плане
У меня есть список аргументов:
a!(1, 2, 3)

Мне нужно получить вызов вида:
A::new().f(3).f(2).f(1)
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Я хочу обойтись без создания промежуточного вектора
источник

P

Pavel in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Не в этом плане
У меня есть список аргументов:
a!(1, 2, 3)

Мне нужно получить вызов вида:
A::new().f(3).f(2).f(1)
мне кажется, это всё ещё делается через macro_rules!
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Pavel
мне кажется, это всё ещё делается через macro_rules!
Делается, но неудобно и через рекурсию
источник

P

Pavel in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Делается, но неудобно и через рекурсию
так зачем тебе эта структура в процмакро?
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Pavel
так зачем тебе эта структура в процмакро?
Технически, я могу сгенерировать токенстрим вида ::main_crate::A::new().f(3).f(2).f(1), но без основного крейта в зависимостях он всё равно не скомпилируется
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=1696e66db6a5925b11876feebd961114
Я пробовал сделать на macro_rules!{}, но у меня не вышло ничего разумного
источник

ID

Ivan Dubrov in Rust — русскоговорящее сообществo
Emmanuel Goldstein
У меня есть структура A, которую я хочу создавать макросом a!().
Очевидно, чтобы пользоваться макросом нужно, чтобы в доступе была структура.
В крейте, в котором располагается структура, я хочу мочь пользоваться этим макросом.
Так а в чем проблема? proc макросы генерируют синтаксис, им более-менее пофиг что там где задекларировано.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Ivan Dubrov
Так а в чем проблема? proc макросы генерируют синтаксис, им более-менее пофиг что там где задекларировано.
Юзер сможет поставить крейт с процмакросом, не поставить основной и получить фигню
источник

ID

Ivan Dubrov in Rust — русскоговорящее сообществo
Так не давай прямой доступ до процмакроса, реэкспортируй его через основной крейт. Как все обычно делают.
источник

ID

Ivan Dubrov in Rust — русскоговорящее сообществo
А макрос будет генерировать полные пути типа: whatever::SomeType, где whatever -- имя твоего основного крейта. А чтоб это внутри whatever тоже работало, делай extern crate self as whatever внутри whatever.
источник

ID

Ivan Dubrov in Rust — русскоговорящее сообществo
И не забудь поставить лайк здесь: https://internals.rust-lang.org/t/crate-metavariable-for-procedural-macros/11446 lol
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Разумно
Если сейчас не сумею выразить на macro_rules!, так и сделаю
источник