Описание тега rust-macros
Макросы Rust - мощный инструмент для отображения определенной входной последовательности на выходную в соответствии с определенной процедурой.
1
ответ
Как проверить, начинается ли идентификатор в макросе с подчеркивания?
Мне нужно проверить, начинается ли идентификатор с подчеркивания. Это не работает: #[macro_export] macro_rules! UNDECORED { (_$_i:ident) => {... do something if underscored}; ($_i:ident) => {... do something else}; } Где ошибка?
25 ноя '17 в 13:49
2
ответа
Почему макросы, основанные на абстрактных синтаксических деревьях, лучше, чем макросы, основанные на предварительной обработке строк?
Я начинаю свой путь изучения Руста. Я наткнулся на эту строку в Rust на примере : Однако, в отличие от макросов в C и других языках, макросы Rust расширены в абстрактные синтаксические деревья, а не в предварительную обработку строк, поэтому вы не п…
24 май '18 в 14:39
1
ответ
Почему я не могу передать захваченный токен во вложенный макрос?
Многочисленные примеры, которые я видел, предполагают, что это должно быть возможно, но это, очевидно, не так: lib.rs: #![feature(trace_macros)] #[macro_export] macro_rules! inner_macro ( (f32) => {"float"}; ); #[macro_export] macro_rules! outer_…
23 ноя '18 в 16:15
1
ответ
Конвертировать строку в TokenStream
Учитывая строку (str), как можно преобразовать это в TokenStream в ржавчине? Я пытался использовать quote! макро. let str = "4"; let tokens = quote! { let num = #str; }; // #str is a str not i32 Цель здесь - сгенерировать токены для некоторой неизве…
13 янв '19 в 00:28
0
ответов
Использовать включенный текст в качестве аргумента макроса
Я пытаюсь создать возможность для анализа файла заголовка C во время компиляции (и генерировать набор числовых констант для использования в другом коде). Мне не нужно анализировать все конструкции файла заголовка, так как я контролирую его содержимо…
10 фев '19 в 04:25
1
ответ
Почему я не могу получить доступ к переменной, объявленной в макросе, если я не передам имя переменной?
У меня есть этот макрос: macro_rules! set_vars { ( $($x:ident),* ) => { let outer = 42; $( let $x = outer; )* } } Что расширяет этот вызов: set_vars!(x, y, z); в то, что я ожидаю (от --pretty=expanded): let outer = 42; let x = outer; let y = oute…
11 дек '18 в 01:21
1
ответ
Зависимость циклического пакета при реализации макроса proc
Я пытаюсь реализовать proc_macro Dump, который похож на serdes Serialize, Для этого у меня есть ящик foo который содержит мои "примитивные" структуры (P1 а также P2 в этом случае), который должен быть только самосвальным. Далее у меня есть foo_deriv…
08 янв '19 в 08:50
1
ответ
Как сделать публичную структуру, где все поля являются публичными, не повторяя `pub` для каждого поля?
Как я могу определить публичную структуру в Rust, где все поля являются открытыми, не повторяя pub модификатор перед каждым полем? pub_struct макрос был бы идеальным: pub_struct! Foo { a: i32, b: f64, // ... } что будет эквивалентно: pub struct Foo …
20 дек '18 в 10:11
2
ответа
Индексирование кортежей в макросе
Я пытаюсь индексировать кортеж данных в макросе, который генерирует подпись для реализации черты, но есть некоторые ошибки. Могу ли я индексировать кортеж или нужно другое решение? Взломать с tuple_index Я нашел в Google, но это не работает для меня…
13 фев '19 в 07:53
1
ответ
Как предоставить полезные ошибки компилятора в процедурном макросе?
Я разрабатываю собственный синтаксический анализатор HTML, используя proc_macro а также syn, Образец: #[derive(Debug)] struct BlockElement { stag: Ident, child: Vec<Element>, ctag: Ident } impl Synom for BlockElement { named!(parse -> Self,…
27 фев '18 в 09:23
1
ответ
Как добавить примеры к документации макросов в rust?
При написании макроса я хотел бы документально оформить его, и это включает в себя примеры.Но когда я пытаюсь сделать это так же, как обычную функцию, я получаю: [E0468]: an `extern crate` loading macros must be at the crate root я бегу cargo test н…
30 дек '17 в 12:29
1
ответ
Неожиданный конец вызова макроса в Rust
У меня есть следующий код в Rust use std::fmt; pub struct MyRange<Idx> { pub start: Idx, pub end: Idx, } impl fmt::Debug for MyRange<f32> { fn fmt( &self, f: &mut fmt::Formatter ) -> fmt::Result { write!( "Nothing seriously" )…
06 сен '17 в 19:22
2
ответа
Как инициализировать структуру с помощью ряда аргументов
Во многих языках общей конструкторской идиомой является инициализация значений объекта с использованием синтаксиса, подобного этому псевдокоду: constructor Foo(args...) { for arg { object.arg = arg } } Сначала кажется, что ржавчина не является исклю…
25 май '17 в 01:06
1
ответ
Неиспользуемая переменная в сгенерированном макросе
Я написал макрос, который реализует подобный Scala для понимания в Rust. Это превратит это: map_for!{ x <- 0..4; y = 2*x; z <- 0..1; => y+z } в это: ((0..4).map (move |x| { let y = 2 * x; (x, y) })) .flat_map (move |params| { let (x, y) = p…
23 июн '17 в 13:08
1
ответ
Ошибка макроса при попытке реализовать черту внутри макроса
fn a() {} кажется, удовлетворяет правилу синтаксического анализа, который ожидал fnи другие вещи. items должен быть в состоянии быть определениями функций, верно? Значит, они должны работать, верно? macro_rules! multi_impl { (for $base:ty : $($t:ty …
08 июн '17 в 03:32
2
ответа
Подберите подчеркивание вместо идент в макросе
Я создаю макрос, который соответствует двум выражениям и идентификатору. Я хотел бы иметь возможность игнорировать идентификатор, если он не нужен, но компилятор, кажется, жалуется, если я использую _ там. Мой макрос: macro_rules! if_some { ($x:expr…
15 июл '17 в 06:59
1
ответ
Распечатать! макрос выполняется не в порядке
Часть моего кода выглядит так: print_usage_instructions(); print!("Command: "); let stdin = io::stdin(); let mut line = String::new(); stdin.lock().read_line(&mut line).expect("Couldn't process the command."); println!("{}", line); Поведение, ко…
02 апр '18 в 07:35
1
ответ
Можно ли повторить сопоставление по нескольким правилам в макросе?
Могу ли я повторить матч в макросе Rust? Я хочу иметь возможность сделать что-то вроде: my_dsl! { foo <other tokens>; bar <other tokens>; foo <other tokens>; ... } В основном, произвольное количество операторов, разделенных точкой …
12 дек '18 в 05:50
1
ответ
Макросы Rust: как создать производный идентификатор?
Похоже, что для идентификаторов я могу либо использовать существующий токен идентификатора, либо создать фиксированный / литеральный идентификатор. Но как создать "производный" идентификатор? То есть, имея существующий токен $id, я хочу создать неко…
14 дек '18 в 07:33
1
ответ
Как использовать пользовательский атрибут пространства-имени для макроса имен вместо типа внутри?
Я хотел бы создать собственный макрос-наследник, который использует новый синтаксис пространства имен: example::attr, Я смог заставить это работать с атрибутами в типе (например, в структурном поле или варианте enum), но не при применении к самому т…
27 фев '19 в 16:36