我刚学Rust,本帖cute? but not accurate; short, but very very basic. 别人写复杂的宏无可奈何,自己搞得太复杂的话,岂不是才出引用计数、模板这些虎坑,又入狼穴?
macro_rules! T { ($x:expr) => { $x } }
fn main() { println!("{}", T!("Hello, world!")); }
PHP里变量名前要有$;PASCAL里变量:类型,所以用C话说就是:expr $x; 前者类型(Rust话Designator),后者变量名。除了expr外还有block, statement, pattern等。
上例只有1条rule: 把类型为expr的$x替换成{ $x }。可以写规则们(rules)。T是宏的名字,用它的时候要加!。
fn main() {
let x = { 3 };
println!("{}", x);
}
//; LISP里的lmabda - a statement that evaluates to an 匿名的 function that computes x^2 + y^2
//; (lambda (x y) (+ (* x x) (* y y)))
不妨把上面的{ 3 }叫做lmabda。C话里return 3; 汇编话里mov ax, 3; ret,ret只清理堆栈,大家约定用寄存器ax放函数返回值,总之:{3}返回3,不比int three(){return 3;}异端。
use std::collections::HashMap;
macro_rules! CreateDict {
($($key:expr => $val:expr), *) => {{
let mut m = HashMap::new();
$(m.insert($key, $val);)*
m
}};
}
fn main() {
let dict = CreateDict!("co-" => "together", "de-" => "remove", "re-" => "again");
println!("{:?}", dict);
}
//
https://doc.rust-lang.org/beta/reference/macros-by-example.html#macros-by-example// 有BNF范式。我学不动了,上例抄的。
*就像正则表达式的*。CreateDict换成ldoce就像样了。
--
FROM 106.121.154.*