在Rust中是否可以定义一个可以解析自定义文字的宏,例如类似于
的东西vector!(3x + 15y)
为了澄清,我希望能够尽可能地接近上述语法(当然在可能的范围内)。
我将假设“自定义文字”是指“常规Rust文字(不包括原始文字),后跟自定义标识符”。这包括:
"str"x
,带有自定义后缀"str"
]的字符串文字[C0x
,带有自定义后缀123x
]的数字文字[C0123
,带有自定义后缀x
]的字节文字[C0如果以上内容对您来说足够,那么您很幸运,因为根据b"bytes"x
,以上内容的确是Rust中所有有效的文字标记:]
允许宏支持自定义字符串文字。后缀是立即数(不带空格)紧随文字主要部分之后的非原始标识符。
任何带后缀的文字(字符串,整数等)都可以作为标记使用,并且可以传递给宏而不会产生错误。宏本身将决定如何解释此类令牌以及是否产生错误。
但是,解析为Rust代码的文字标记的后缀受到限制。非数字文字标记将拒绝所有后缀,并且数字文字标记仅与下面列表中的后缀一起接受。
So Rust explicitly
现在,您将如何编写这样的宏?您无法使用b"bytes"
编写声明性宏,因为无法通过其简单的模式匹配来检测和处理自定义文字后缀。但是,可以编写执行此操作的x
。
我将不会过多地介绍如何编写过程宏,因为在单个StackOverflow答案中将写太多内容。但是,我将为您提供一个过程宏的示例,该宏以起点为基础,按照您的要求进行操作。它使用给定表达式中的所有自定义整数文字the Rust reference或macro_rules!
,并将其转换为函数调用procedural macro和123x
:
123y
例如,宏会将
x_literal(123)
转换为y_literal(123)
。