はじめに
#NO IMAGEマクロ - The Rust Programming Language 日本語版
を読んでいる。
お勉強
#NO IMAGEマクロ - The Rust Programming Language 日本語版
- 遅延して昼から勉強しているが一番元気な時間かもしれない
- 3つのcrateを使ってメタプログラミングすることがわかった
メモ
#TokenStreamでコードを生成するがresult型じゃないのでエラーハンドリングが難しい- そこをうまくやろうと書いている
fn impl_hello_macro(ast: &syn::DeriveInput) -> TokenStream {
let name = &ast.ident;
let gen = quote! {
impl HelloMacro for #name {
fn hello_macro() {
println!("Hello, Macro! My name is {}!", stringify!(#name));
}
}
};
gen.into()
}
- んー宣言のときより普通のコードだな
- ここに関してはちゃんと型使っているのウケるな
quote!マクロを使うことで、私達が返したいRustコードを定義することができます。ただ、コンパイラが期待しているものはquote!マクロの実行結果とはちょっと違うものです。なので、TokenStreamに変換してやる必要があります。
- マクロ作るためにマクロ使っているのにマクロの期待値とは違うとはこれはいかに
ここで使用した
stringify!マクロは、言語に組み込まれています。1 + 2などのようなRustの式を取り、コンパイル時に"1 + 2"のような文字列リテラルにその式を変換します。
- ガチで文字列操作だけでコード書けてしまう
- 説明が長すぎて忘れていたが
#[derive(HelloMacro)]はhello_macroトレイトを自動実装するマクロだった - 雰囲気だけ分かったが、実際に動かさないと明示的には説明できないなーと思った
まとめ
#- 何でもありすぎて言語の学びとしてこれといえなくなってきた
- 次は多分最後