「proc-macro-workshop」で学ぶ手続き型マクロ
Rustにハマりつつあるナナオです。 最近Rustばかり触っているのですが、Rustはpythonと比べるととにかくコーディングに時間がかかってしまうのが欠点だなと思うこの頃… 自前の構造体とか作って運用してると、気をつけないと同じよーな処理がプロジェクト内に点在してしまいがちだなと感じています。 (deriveを活用できていないケースとか) そこで今回はRustのメタプログラミングツール、マクロについて学んでいこうと思います。 -> 僕がマクロを学ぶきっかけになった記事はこちら 前提知識となるマクロの参考資料は以下。 マクロ - The Rust Programming Language 日本語版 Rustのマクロを覚える #Rust - Qiita マクロのチュートリアルを実践する マクロを学ぶためのちょうどいいリポジトリがありました。 GitHub - dtolnay/proc-macro-workshop: Learn to write Rust procedural macros [Rust Latam conference, Montevideo Uruguay, March 2019] マクロを使用するパターンについて、いくつかのケーススタディが用意されています。 bitfield builder debug seq sorted とりあえず聞き馴染みのあるbuilderからやってみます。 9つテストケースが用意されており、一つづつパスできるようにしていくことで、段階的にBuilderマクロを実装できるという内容になっています。 わかりやすい。。 ここからは自分の備忘録も兼ねて答えとなるコードを載せていきます。 もし自分で解きたいと言う場合はこれから先の閲覧は注意してください。 01-parse.rs これはとりあえずTokenStreamを返却できればいいだけですね。 必要なライブラリを追加してあげます。 cargo add syn quote とりあえずquote!マクロの結果を返却するだけでこのテストは通ります。 use proc_macro::TokenStream; use quote::quote; #[proc_macro_derive(Builder)] pub fn derive(input: TokenStream) -> TokenStream { let _ = input; let q = quote! {} q.into() } 02-create-builder.rs さて、ここからが本番です。 ...