2016-04-19 7 views
1

次のコードは、macro_rule!の制限の単純なテストです。それは正しく[1, 2]をターゲットとして印刷します。私は[[1,2][[1,2],3]に変更した場合Rustマクロは複数レイヤのネストされた式を扱うことができますか?

macro_rules! test { 
    ($target:tt) => { 
     println!("{:?}", $target); 
    }; 
    ($target:tt, $($rest:tt),*) => { 
     test!($target) 
    }; 
    ([$target:tt, $($inner_rest:tt),*],$($rest:tt),*) => { 
     test!($target) 
    } 
} 

fn main() { 
    test![[1, 2], [[5, 6], 3], 4]; 
} 

はしかし、コンパイラは文句:マクロが再帰的にブラケットに対処し、最初のアイテムを印刷できるようにする方法は

<anon>:16:15: 16:16 error: mismatched types: 
expected `[_; 2]`, 
    found `_` 
(expected array of 2 elements, 
    found integral variable) [E0308] 
<anon>:16 test![[[1,2],3],[[5,6],3],4]; 
         ^
<std macros>:2:25: 2:56 note: in this expansion of format_args! 
<std macros>:3:1: 3:54 note: in this expansion of print! (defined in <std macros>) 
<anon>:4:5: 4:30 note: in this expansion of println! (defined in <std macros>) 
<anon>:7:6: 7:20 note: in this expansion of test! (defined in <anon>) 
<anon>:16:2: 16:31 note: in this expansion of test! (defined in <anon>) 
<anon>:16:15: 16:16 help: see the detailed explanation for E0308 
error: aborting due to previous error 
playpen: application terminated with error code 101 

ありますか?私はthe example given by the Rust documentationを勉強しましたが、私の場合はそれをどのように実装するかについてまだ考えていません。

答えて

2

あなたは式を解析するように頼んだので、それはちょうどを試したものです。

最初に表示されるのは[[1, 2], 3]です。これは、最初の要素が[i32; 2]で、2番目の要素がi32の配列リテラルであるため無効です。だから、失敗する。

マクロで再帰構文を処理する場合は、それを処理するためにマクロを記述する必要があります。私はあなたが何をしようとしているのか分かりません( "ブラケットを扱う" )ので、具体的な例はありません。 の前にの特別なルールを追加して、明示的に[[$($stuff:tt)*] ...を処理する既存のルールを追加してみてください。ルールはトップからボトムまで処理されるため、最も具体的なルールを最初に置く必要があります。以下は、[1, 2]を印刷します。

macro_rules! test { 
    ([$target:tt, $($inner_rest:tt),*], $($rest:tt),*) => { 
     test!($target) 
    }; 
    ($target:tt) => { 
     println!("{:?}", $target); 
    }; 
    ($target:tt, $($rest:tt),*) => { 
     test!($target) 
    }; 
} 

fn main() { 
    test![[[1,2],3],[[5,6],3],4]; 
} 
+0

ありがとうございました!私は再帰的なマクロで質問を更新しましたが、それでも動作しません。何が間違っているのか教えてください。 – divinites

+0

@divinitesあなたはまだマクロに何をしたいのかを指定していませんか?私はあなたが望むものを推測しました。 –

+0

ありがとう!それはまさに私が欲しいものです。 – divinites

関連する問題