目次

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

(更新: )ぎじゅつ

はじめに

#

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

  • 4/1夜中から4/4朝ぐらいまで体調崩してた
  • 風邪を引きました
  • とはいえ32歳にして2.5日でほぼ病み上がり感もなくなったのは超人な感じがでてきてよい

お勉強

#

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

  • マクロをやる
  • なぜこれが黒魔術といわれるのか知りたい

メモ

#

本全体を通じてprintln!のようなマクロを使用してきましたが、マクロがなんなのかや、どう動いているのかということは完全には探究していませんでした。

  • それはそう
  • println!ってマクロなんですよ、とか言われてはぁ?となった記憶

Rustにおいて、マクロという用語はある機能の集合のことを指します:macro_rules!を使った 宣言的 (declarative) マクロと、3種類の 手続き的 (procedural) マクロ:

  • 日本語がおかしいけどなるほど

構造体とenumにderive属性を使ったときに追加されるコードを指定する、カスタムの#[derive]マクロ

  • いまさらだけどderiveってマクロなんだなー

  • とりあえずサラーッっと読んでみたけども書き方まで教えてくれるんだな

  • ざっくり知っておきたいぜ

基本的に、マクロは、他のコードを記述するコードを書く術であり、これはメタプログラミングとして知られています

  • で、でたー、メタプログラミング
    • 多分これって認識があるんだけど合っているかわからないから知りたいぜ

メタプログラミングって何?
利用コードを動的に処理ではなくコード記述として再現することをメタプログラミングだと思っているが違う言語でもなりたつ?

  • こんな感じで投げた

通常のプログラミングが「データを操作して結果を出す」のに対し、メタプログラミングは**「コードをデータとして扱い、それを操作して新しいコードや振る舞いを作る」**ことを指します。

  • ほーん、わかったようなわからないような
  • 多分言語違ってもなりたつやつだなこれ

メタプログラミングは、書いて管理しなければならないコード量を減らすのに有用で、これは、関数の役目の一つでもあります。ですが、マクロには関数にはない追加の力があります。

  • ふむ

関数シグニチャは、関数の引数の数と型を宣言しなければなりません。
一方、マクロは可変長の引数を取れます: println!("hello")のように1引数で呼んだり、println!("hello {}", name)のように2引数で呼んだりできるのです。
また、マクロは、コンパイラがコードの意味を解釈する前に展開されるので、例えば、与えられた型にトレイトを実装できます。関数ではできません。何故なら、関数は実行時に呼ばれ、トレイトはコンパイル時に実装される必要があるからです。

  • なんでもできるじゃん
  • そらそうか、だからメタプログラミングなのか

まとめ

#
  • まだまだ知らない常識があるなと思った

  • このタイミングで全部払拭するぞ

  • とりあえず、メタプログラミングの認識が相違なくて良かった

  • 引き続きここ

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