Amagramming

Rustのマクロ学習メモ①

June 30, 2019

環境: rust 1.36.0

初めてマクロというものを書いてみた。

rust の macro_rules は scheme のマクロの一つ define-syntax とほぼ使い方は同じなので、後者を書いた経験があれば前者は簡単です

と強い人に煽られてしまったけど、
Rubyからプログラミングに入門した文系卒プログラマには自明でないことが多かったのでメモしていく。

①と書いてるけど②があるとは言っていない

参考リンク

式指定子の後に来れるのは =>,;のみ

jsonのパーサを書いてみようとして

macro_rules! json {
    ( {$k:expr : $v:expr} ) => { println!("key=>{}, value=>{}", $k, $v); }
}

でコンパイルしたらエラー

error: `$k:expr` is followed by `:`, which is not allowed for `expr` fragments
  = note: allowed there are: `=>`, `,` or `;`

当初エラーの意味がよくわからなかったけど、
よく考えてみれば式の終わりがどこかわからないとキャプチャ(というんだろうか)の範囲が一意に定まらないからだろうなと。

正規表現みたいな先読みがあるわけでもないし。
たとえば(↓の例はもちろんコンパイル通らない)

macro_rules! json {
    ( $x:expr :) => {}
}

fn main() {
    json!(1:2:3:)
}

だと $x1 なのか 1:2 なのか 1:2:3なのか決定できないすもんね。納得。


Written by rnitta who lives and works in Tokyo building nothing.
You can follow him on Twitter