Crates.io | seq-macro |
lib.rs | seq-macro |
version | 0.3.5 |
source | src |
created_at | 2018-08-22 21:18:19.293265 |
updated_at | 2023-07-15 19:24:46.191499 |
description | Macro to repeat sequentially indexed copies of a fragment of code. |
homepage | |
repository | https://github.com/dtolnay/seq-macro |
max_upload_size | |
id | 80808 |
size | 44,570 |
seq!
A seq!
macro to repeat a fragment of source code and substitute into each
repetition a sequential numeric counter.
[dependencies]
seq-macro = "0.3"
use seq_macro::seq;
fn main() {
let tuple = (1000, 100, 10);
let mut sum = 0;
// Expands to:
//
// sum += tuple.0;
// sum += tuple.1;
// sum += tuple.2;
//
// This cannot be written using an ordinary for-loop because elements of
// a tuple can only be accessed by their integer literal index, not by a
// variable.
seq!(N in 0..=2 {
sum += tuple.N;
});
assert_eq!(sum, 1110);
}
If the input tokens contain a section surrounded by #(
... )*
then only
that part is repeated.
The numeric counter can be pasted onto the end of some prefix to form sequential identifiers.
use seq_macro::seq;
seq!(N in 64..=127 {
#[derive(Debug)]
enum Demo {
// Expands to Variant64, Variant65, ...
#(
Variant~N,
)*
}
});
fn main() {
assert_eq!("Variant99", format!("{:?}", Demo::Variant99));
}
Byte and character ranges are supported: b'a'..=b'z'
, 'a'..='z'
.
If the range bounds are written in binary, octal, hex, or with zero padding, those features are preserved in any generated tokens.
use seq_macro::seq;
seq!(P in 0x000..=0x00F {
// expands to structs Pin000, ..., Pin009, Pin00A, ..., Pin00F
struct Pin~P;
});