首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用递归声明性宏创建枚举

使用递归声明性宏创建枚举
EN

Stack Overflow用户
提问于 2022-05-03 05:16:46
回答 1查看 107关注 0票数 0

是否有可能用Rust编写一个声明性宏,该宏采用树状的块结构,并创建一个组合的枚举?我正在试图确定,这是只可能的过程宏,或我是否可以逃脱使用TT。递归并不是唯一的挑战,因为我还需要组合标识每个块的标识符,比如ExposureMode变成ExposureMode,我似乎找不到实现这一目标的方法。

例如,给定如下语句:

代码语言:javascript
复制
enum_tree! {
  Exposure {
    Mode {
      FullAuto,
      Manual,
      ShutterPriority,
      IrisPriority,
      GainPriority,
    },
    Iris {
      Reset,
      Up,
      Down,
      Direct(u8),
    },
  },
  Focus {
    In,
    Out,
    Stop,
  }
}

会产生这样的结果:

代码语言:javascript
复制
enum ExposureMode {
    FullAuto,
    Manual,
    ShutterPriority,
    IrisPriority,
    GainPriority,
}
enum ExposureIris {
    Reset,
    Up,
    Down,
    Direct(u8),
}
enum Focus {
    In,
    Out,
    Stop,
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-03 05:35:37

如果我没记错的话,tt-muncher是图灵全的,因此几乎等同于proc宏.即使他们不是一般人,这个问题也是可以用他们解决的。

他们唯一不能做的就是操纵原子..。比如连接标识符。这有一个concat_ident!()宏,但正如它的文档中所解释的:

此外,作为一般规则,宏只允许在项、语句或表达式位置。这意味着,虽然您可以使用这个宏来引用现有的变量、函数或模块等,但是您不能用它定义一个新的宏。

因此,它不适用于这种情况。但是,这并不意味着您不能使用macro_rules,因为人们已经用能够连接标识符的proc宏编写了板条箱。一个流行的例子是粘贴

然而,如果宏是复杂的,您可能会发现它更容易理解和编写为一个proc宏。

另见是否可以使用Rust宏在过程中声明变量?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72095045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档