2016-09-06 5 views
1

macro matching exampleが与えられているので、これはマクロが引数とどのように一致するかを示しています。マクロはリテラルではなく定数引数とマッチできますか?

私は番号を使用するためにここに非常にマイナーな変更を加えました:

macro_rules! foo { 
    (0 => $e:expr) => (println!("mode X: {}", $e)); 
    (1 => $e:expr) => (println!("mode Y: {}", $e)); 
} 

fn main() { 
    foo!(1 => 3); 
} 

作品、印刷:mode Y: 3

を、私は、引数として定数を使用したいと思いますしかし、これは作品にすることができます:

これはRustで可能ですか?私のコードでは、各支店がエラーを与えて、さまざまなタイプに解決するので、通常のmatch文を使用して


注意が、私には使用できません。 私は特に、定数がマクロに渡せるかどうかを知りたいと思っています。

+0

ありがとう、 – ideasman42

+0

を修正しました。「各ブランチは異なるタイプに解決されます」と言います。あなたは例を挙げることができますか? –

答えて

4

マクロは抽象構文木の上で動作するので、彼らは、構文レベルでの理由:彼らがおよそトークンとそのスペルを理由。例えば

fn main() { 
    let v = 3; 
} 

この場合、ASTのようなものになります。あなたはv3あるマクロかどうかを尋ねる場合

fn main 
    \_ let-binding v 
     \_ literal 3 

を、それはおかしいあなたを見て、となります変数名とリテラルを比較しようとするのはなぜだろうか。

+1

私はそれがASTではないと思う - 完全に解析されていないトークンがマクロに与えられている(マクロは部分的に解析する方法を部分的に定義しているので)。あなたが '$ e:expr'を持っているので、解析されずに完全解析されていません。 –

+0

@ChrisEmerson:はい、これより少し緩いです。 –

4

答えは「いいえ」です。マクロ展開時には、トークンツリーだけがあります。展開前に評価が行われたり、型推論/チェックさえされたりします。

+0

@LukasKalbertodt:同意し、ロールバックしました。 –

関連する問題