Rust
Macros
Declarative and procedural macros.
By EZ4Code Team
macromacro
Code
// Declarative macro
macro_rules! vec_of {
($($x:expr),*) => {{
let mut v = Vec::new();
$( v.push($x); )*
v
}};
}
macro_rules! calculate {
(eval $e:expr) => {
{
let val: usize = $e;
println!("{} = {}", stringify!($e), val);
}
};
}
// HashMap initialization macro
macro_rules! hashmap {
($($key:expr => $value:expr),*) => {{
let mut map = std::collections::HashMap::new();
$( map.insert($key, $value); )*
map
}};
}
fn main() {
let v = vec_of!(1, 2, 3, 4, 5);
println!("{:?}", v);
calculate!(eval 1 + 2 * 3);
let scores = hashmap!(
"Alice" => 10,
"Bob" => 20
);
println!("{:?}", scores);
// Built-in macros
println!("file: {}", file!());
println!("line: {}", line!());
println!("crate: {}", module_path!());
}Explanation
macro_rules! defines declarative macros, generating code via pattern matching; built-in macros provide compile-time info.