簡體   English   中英

為什么不能生銹macro_rules! pat 后跟“<”?

[英]Why cant rust macro_rules! pat be followed by "<"?

在 L-System 符號中,模式看起來像這樣:

A(a)<A(x)>B(b, c) if a+b+c < 10 => B(a+b, a+c)A(x+a+b+c)

我正在嘗試編寫 rust 宏來擴展這些。 所以我有這樣的事情:

macro_rules! test {
    ($lc:pat < $a:pat > $rc:pat) => { ... };
}

但它不會讓我。 它說:

error: `$a:pat` is followed by `>`, which is not allowed for `pat` fragments
 --> src/main.rs:7:23
  |
7 |     ($lc:pat < $a:pat > $rc:pat) => { log_syntax!($lc); log_syntax!($a); log_syntax!($rc); };
  |                       ^ not allowed after `pat` fragments
  |
  = note: allowed there are: `=>`, `,`, `=`, `|`, `if` or `in`

為什么在 pat 類型之后不允許這些? 我可以匹配什么來獲得這個?

我不能使用tt因為顯然不允許使用括號。

Rust 詞法分析器發出了送入macro_rules宏的令牌; 屬於 Rust 解析器的同一個詞法分析器。 詞法分析器允許許多無效的 Rust 標記序列,在解析正常的 Rust 代碼時,這些標記會被管道中的語法規則捕獲。 但是,詞法分析器知道某種級別的上下文,例如,它可以根據它是在處理類型還是表達式來區分<< (左移運算符)和<< (嵌套類型參數的開始)之類的內容。

在許多情況下,宏可以匹配無效的 Rust 令牌流,但實現謹慎地禁止詞法分析器可能會愉快地發出的許多組合。 這樣做的原因是允許語言開發人員在不破壞現有宏的情況下靈活地執行諸如添加新語法之類的操作。 這條線可能看起來相當隨意,部分原因是歷史——語言的發展方式以及人們早期發布的宏——但這條線必須在某處划定。

我們保證在攝取有效 Rust 代碼的宏(以及許多攝取無效 Rust 代碼的宏)中向前兼容,但代價是不允許許多創造性的應用程序。 隨着時間的推移,隨着語言和編譯器變得越來越穩定,規則可能會逐漸放松,但我想這會慢慢發生,如果有的話。

您的宏匹配無效 Rust 的輸入:模式永遠不會出現在<>之間。 不幸的是,它也不允許在宏中使用,您可能只需要選擇不同的語法。

程序宏的限制較少,也可以作為一種選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM