こちらの記事は Rustマクロ冬期講習アドベントカレンダー 18日目の記事です!
属性風マクロはRustの手続きマクロの一種です。では作っていきます。
最小構成のderiveマクロ
ライブラリクレートを作成します。
cargo new --lib derive_macro
cd derive_macro
Cargo.toml
を書き換えます。
Cargo.toml
[package]
name = "derive_macro"
version = "0.1.0"
edition = "2021"
[lib]
proc-macro = true
[dependencies]
src/lib.rs
を書き換えます。deriveマクロは 追記する マクロで入力の構造体/列挙体を食わないので、空のトークンストリームを吐くことにします。
src/lib.rs
use proc_macro::TokenStream as S;
#[proc_macro_derive(D)]
pub fn d(_: S) -> S {
S::new()
}
動作確認します。
src/main.rs
use derive_macro::D;
#[derive(D)]
struct S;
fn main() {}
cargo run
無事にコンパイルされたところでタイマーストップ。
まとめ・所感
記録は1分46秒10でした。事前に書き方を予習できたのが良かったですね。
...というわけでRTAとかいう冗談は今回までにして、次回以降はもう少しだけちゃんとそれぞれのマクロについて取り組みたいと思います!