目次

Rustの勉強[マクロ その2]

ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる

お勉強

#
  • 風邪を引いてからずっと睡眠していたので復帰の日は逆に眠れなかった
  • し方ないので一日だけこれで頑張る
    • 体調はいい
  • マクロをずっとやっていた
  • メタプログラミングについてちょっとだけ深堀りをしていた

NO IMAGEマクロ - The Rust Programming Language 日本語版

メモ

#
  • ざっくり読んでいるが、宣言的マクロ手続的マクロが存在するらしい
  • ふーーーーん

宣言的マクロは、Rustのmatch式に似た何かを書けるということです。

  • 何かって表現がもうすでにすごいな
let v: Vec<u32> = vec![1, 2, 3];
  • お、これの中身を読むらしい
#[macro_export]
macro_rules! vec {
    ( $( $x:expr ),* ) => {
        {
            let mut temp_vec = Vec::new();
            $(
                temp_vec.push($x);
            )*
            temp_vec
        }
    };
}
  • 意味わからんな
  • neovimで一時期ちょっとだけsnippet書いていたけどその雰囲気に似ている

このマクロをvec![1, 2, 3];と呼び出すと、$xパターンは、3つの式1、2、3で3回マッチします。

  • たしかにね

$()にマッチする箇所ごとに生成されます。 $xはマッチした式それぞれに置き換えられます。このマクロをvec![1, 2, 3];と呼び出すと、このマクロ呼び出しを置き換え、生成されるコードは以下のようになるでしょう:

{
    let mut temp_vec = Vec::new();
    temp_vec.push(1);
    temp_vec.push(2);
    temp_vec.push(3);
    temp_vec
}
  • おおーーーこれはわかりやすい
  • 大枠は理解
  • 当たり前だけどちゃんとrustで書けるんやな
    • 宣言的っていわれてなんかhelmとかterraformを思いだしたな

手続き的マクロを作る際は、その定義はそれ専用の特殊なクレート内に置かれる必要があります。これは複雑な技術的理由によるものであり、将来的には解消したいです。

  • (願望)
    • 製作者でもそういう思想があるんだな
use proc_macro;

#[some_attribute]
pub fn some_name(input: TokenStream) -> TokenStream {}
  • わっけわかんねw
  • まあいいか

まとめ

#
  • めちゃくちゃメタプログラミングって感じだった
  • 宣言型はまあこれやるよねっていうあるあるをマクロ化した感じだな
  • だけどなんでもできちゃうからなんでもマクロにできるので独自でルールを置いておかないと全部やっちゃうね
  • たぶん、ここまで学ぶ必要ないんだけど仕事で使わないしおもしろいのでやってみる

次はここ

NO IMAGEマクロ - The Rust Programming Language 日本語版