Macro for Python-like list\dict comprehensions in Rust.
python
even_squares = [x**2 for x in arr if x % 2 == 0]
flatten_matrix = [x for row in arr for x in row]
dict_comp = {x: len(x) for x in arr}
rust
let even_squares = comp![x.pow(2) for x in arr if x % 2 == 0]
let flatten_matrix = comp![x for row in arr for x in row]
let dict_comp = comp!{x: x.len() for x in arr}
```rust use listcomprehensionmacro::comp;
fn main() {
let arr: Vec
```rust use listcomprehensionmacro::comp;
fn main() {
let arr: Vec
Multiple nesting allowed:
```rust use listcomprehensionmacro::comp;
fn main() {
let arr: Vec
HashMap comprehension (curly brackets for readability):
```rust use listcomprehensionmacro::comp;
fn main() { let arr: Vec<&str> = vec!["hello", "World!"]; let newarr = comp!{x: x.touppercase() for x in arr}; println!("{:?}", new_arr); // {"hello": "HELLO", "World!": "WORLD!"} } ```
Even while
loops are allowed:
```rust use listcomprehensionmacro::comp;
fn main() { let mut i = 0; let newarr = comp![{ i += 1; i } while i < 5]; println!("{:?}", newarr); // [1, 2, 3, 4, 5] } ```
A comprehension like this:
rust
comp![x for x in arr]
Will move arr
which means you won't be able to use it after the comprehension. To prevent moving the value you can pass a pointer instead:
rust
comp![*x for x in &arr]