是否有可能用Rust编写一个声明性宏,该宏采用树状的块结构,并创建一个组合的枚举?我正在试图确定,这是只可能的过程宏,或我是否可以逃脱使用TT。递归并不是唯一的挑战,因为我还需要组合标识每个块的标识符,比如Exposure和Mode变成ExposureMode,我似乎找不到实现这一目标的方法。
例如,给定如下语句:
enum_tree! {
Exposure {
Mode {
FullAuto,
Manual,
ShutterPriority,
IrisPriority,
GainPriority,
},
Iris {
Reset,
Up,
Down,
Direct(u8),
},
},
Focus {
In,
Out,
Stop,
}
}会产生这样的结果:
enum ExposureMode {
FullAuto,
Manual,
ShutterPriority,
IrisPriority,
GainPriority,
}
enum ExposureIris {
Reset,
Up,
Down,
Direct(u8),
}
enum Focus {
In,
Out,
Stop,
}发布于 2022-05-03 05:35:37
如果我没记错的话,tt-muncher是图灵全的,因此几乎等同于proc宏.即使他们不是一般人,这个问题也是可以用他们解决的。
他们唯一不能做的就是操纵原子..。比如连接标识符。这有一个concat_ident!()宏,但正如它的文档中所解释的:
此外,作为一般规则,宏只允许在项、语句或表达式位置。这意味着,虽然您可以使用这个宏来引用现有的变量、函数或模块等,但是您不能用它定义一个新的宏。
因此,它不适用于这种情况。但是,这并不意味着您不能使用macro_rules,因为人们已经用能够连接标识符的proc宏编写了板条箱。一个流行的例子是粘贴。
然而,如果宏是复杂的,您可能会发现它更容易理解和编写为一个proc宏。
https://stackoverflow.com/questions/72095045
复制相似问题