Using macro to implement the comprehensions of imitating python language in rust
- You can initialize common collection types with relatively little code
Vec [v],HashMap {k=>v}andHashSet !{k}have been implemented
Vec Or HashSet Syntax
- Ordinary element:
[foo, 1, 2i32] - for each:
[*(i; for i in 0..10)] - for each and filter:
[*(i; for i in 0..10; if i != 5)] - for each and filter and sub for each:
[*(i + j; for i in 0..10; if i != 5; for j in 1..i)]
HashMap Syntax
- Ordinary element:
{k => v, [k1]: v1} - String ordinary key:
{%[key]: "jack"}(key: String) - Ident key:
{name: "jack"}(name: &'static str) - String ident key:
{%name: "jack"}(name: String) - Variable key:
{*key: "jack"}(let key = "name";) - Literal key:
{"name": "jack"} - Literal key tostring:
{%"name": "jack"}(name: String) - for each: Just like in Vec, but slightly different.
e.g
{*(i => i+1; for i in 0..5)}
Other
- for each reserve:
[*[10](i; for i in 0..10)] - generic params:
<i64>[1, 2, 3] - init with capacity:
(20)[1, 2, 3]|<i64>(20)[1, 2, 3] - inspect block:
[*(i; for i in 0..10; {dbg!(i);} if i & 1 == 0)]
crate: https://crates.io/crates/set_derive
Examples
# use set_derive;
# use HashMap;
let arr1 = vec!;
let arr2 = set_derive!;
// python: [0, 1, *range(8, 10+1), *range(15, 20)]
assert_eq!;
let arr = set_derive!;
// python: [i+j for i in range(6) if i%2 for j in range(0, i)]
assert_eq!;
let age_key = "age";
let jack = set_derive!;
assert_eq!;