fn main() {
let mut a = Vec::new();
a.push(1);
a.push(2);
a.push(3);
}
fn main() {
let a = vec![1, 2, 3];
}
macro_rules! vec {
($($x:expr),+) => ({
let mut v = Vec::new();
$( v.push($x); )+
v
});
}
fn main() {
let a = {
let mut v = Vec::new();
v.push(1);
v.push(2);
v.push(3);
v
};
}
然后,编译器可以像往常一样处理这些代码。
use yew::html;
html! {
<div>
<div class="panel">
{ "Hello, World!" }
</div>
</div>
}
VTag::new(
"div",
vec![VTag::new("div", ...)],
);
这就是宏如何将另一种语言嵌入Rust的。
注意,过程宏中不允许使用被禁止的符号,一个过程宏只能包含在Rust中已经允许的标记。
struct Foo { x: i32, y: i32 }
impl Copy for Foo { ... }
impl Clone for Foo { ... }
impl Ord for Foo { ... }
impl PartialOrd for Foo { ... }
impl Eq for Foo { ... }
impl PartialEq for Foo { ... }
impl Debug for Foo { ... }
impl Hash for Foo { ... }
#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Debug, Hash, Default)]
struct Foo { x: i32, y: i32 }
[package]
name = "my-proc-macro"
version = "0.1.0"
edition = "2021"
[lib]
proc-macro = true
#[proc_macro]
pub fn foo(body: TokenStream) -> TokenStream { ... }
…
foo!( foo bar baz );
#[proc_macro_derive(Bar)]
pub fn bar(body: TokenStream) -> TokenStream { ... }
…
#[derive(Bar)]
struct S;
#[proc_macro_attribute]
pub fn baz(
attr: TokenStream,
item: TokenStream
) -> TokenStream { ... }
…
#[baz]
fn some_item() {}