通过Rust宏自定义文字?

问题描述 投票:5回答:1

在Rust中是否可以定义一个可以解析自定义文字的宏,例如类似于

的东西
vector!(3x + 15y)

为了澄清,我希望能够尽可能地接近上述语法(当然在可能的范围内)。

rust rust-macros
1个回答
5
投票

我将假设“自定义文字”是指“常规Rust文字(不包括原始文字),后跟自定义标识符”。这包括:

  • ["str"x,带有自定义后缀"str"]的字符串文字[C0
  • [x,带有自定义后缀123x]的数字文字[C0
  • [123,带有自定义后缀x]的字节文字[C0

如果以上内容对您来说足够,那么您很幸运,因为根据b"bytes"x,以上内容的确是Rust中所有有效的文字标记:]

后缀是立即数(不带空格)紧随文字主要部分之后的非原始标识符。

任何带后缀的文字(字符串,整数等)都可以作为标记使用,并且可以传递给宏而不会产生错误。宏本身将决定如何解释此类令牌以及是否产生错误。

但是,解析为Rust代码的文字标记的后缀受到限制。非数字文字标记将拒绝所有后缀,并且数字文字标记仅与下面列表中的后缀一起接受。

So Rust explicitly

允许宏支持自定义字符串文字。

现在,您将如何编写这样的宏?您无法使用b"bytes"编写声明性宏,因为无法通过其简单的模式匹配来检测和处理自定义文字后缀。但是,可以编写执行此操作的x

我将不会过多地介绍如何编写过程宏,因为在单个StackOverflow答案中将写太多内容。但是,我将为您提供一个过程宏的示例,该宏以起点为基础,按照您的要求进行操作。它使用给定表达式中的所有自定义整数文字the Rust referencemacro_rules!,并将其转换为函数调用procedural macro123x

123y

例如,宏会将x_literal(123)转换为y_literal(123)

© www.soinside.com 2019 - 2024. All rights reserved.