Enums 如何使用宏生成可能包含或不包含关联值的枚举变量?

Enums 如何使用宏生成可能包含或不包含关联值的枚举变量?,enums,rust,rust-macros,Enums,Rust,Rust Macros,我试图制作一个宏来定义一些表示汇编指令的枚举变量 现在,我有下面的方法,效果很好。这是非常无用的,但最终我将添加一些自动派生的方法,以便在以后有一个用途: macro_rules! define_instructions { ($($inames:tt),+ $(,)*) => { #[derive(Debug)] pub enum Instruction { $($inames),* } }; }

我试图制作一个宏来定义一些表示汇编指令的枚举变量

现在,我有下面的方法,效果很好。这是非常无用的,但最终我将添加一些自动派生的方法,以便在以后有一个用途:

macro_rules! define_instructions {
    ($($inames:tt),+ $(,)*) => {
        #[derive(Debug)]
        pub enum Instruction {
            $($inames),*
        }
    };
}

define_instructions! {
    PsqLux,
    PsqLx,
    Twi,
}

fn main() {}
问题是,我将要添加的大多数(但不是所有)变体都需要关联值:

define_instructions! {
    PsqLux(u32, u32, u32, u32, u32),
    PsqLx(u32, u32, u32, u32, u32),
    Twi(u32, u32, u32),
    SomethingWithoutAVariant,
}
我尝试使用它来允许变量具有关联的值(它实际上还不支持关联的值,这只是一个开始):

该代码给了我以下错误:

错误:应为“(”、“=”、“{”或“}”中的一个,已找到“`
-->src/main.rs:17:32
|
17 |定义指令!{@define$($inames)*}
|^此处应为“(”、“、=”、“{”或“}”之一
...
22 |/定义|说明{
23 | | PsqLux,
24 | | PsqLx,
25 | | Twi,
26 | | }
|在这个宏调用中
似乎我不能在
enum
定义中使用宏。假设这是真的,我如何解决这个问题并生成可能包含或不包含关联值的enum变量

注意:我肯定我添加的规则有问题,但我至少希望能够达到我可以调用它们的程度,这样我就可以让它们工作

编辑

另一种方法来做我想做的事情,这在目前是很有帮助的

但是,我仍然想知道如何在枚举定义中使用宏,因为将来我可以像这样编写宏:

define_instructions! {
    /// Name: Trap Word Immediate
    /// Simplified Mnemonics:
    /// twgti rA, value = twi 8, _rA, _value
    /// twllei rA, value = twi 6, _rA, _value
    twi TO, rA, SIMM;

    // and so on...  
}

// That macro would become

pub enum Instruction {
    /// Name: Trap Word Immediate
    /// Usage: twi TO, rA, SIMM
    /// Simplified Mnemonics:
    /// twi 8, rA, value = twgti rA, value
    /// twllei rA, value = twi 6, rA, value
    Twi(u32, u32, u32, u32, u32),
}

所以我有了解决办法,但我仍然好奇是否可以在
enum
定义中使用宏。这可能吗?如果不可能,为什么不可能?

您的目标到底是什么?一个更简单的匹配器,如
($($inames:tt)*=>{enum指令{$($inames)*}
工作正常,所以我猜您正在尝试对变体做更多的操作,这将有助于描述。啊,谢谢,这有助于我现在尝试的操作。我没想过要尝试(这是我在Rust中的第一个宏,所以我仍在弄清楚这一切)。虽然稍后将宏放在那里可能有助于其他内容,因此我将更新问题,以包括可能的内容。您希望宏修改文档注释吗?我还没有真正计划好,这可能是个坏主意。我只是急于获取有关该问题的示例。主要的一点是枚举RIANT是从文档中创建的。我可以删除其余的细节来关注它。此外,您希望将
twi
修改为
twi
,并以某种方式直觉地认为3个值
to、rA、SIMM
变成5
u32
?听起来您正试图将实际的汇编程序实现为一个宏。。。
define_instructions! {
    /// Name: Trap Word Immediate
    /// Simplified Mnemonics:
    /// twgti rA, value = twi 8, _rA, _value
    /// twllei rA, value = twi 6, _rA, _value
    twi TO, rA, SIMM;

    // and so on...  
}

// That macro would become

pub enum Instruction {
    /// Name: Trap Word Immediate
    /// Usage: twi TO, rA, SIMM
    /// Simplified Mnemonics:
    /// twi 8, rA, value = twgti rA, value
    /// twllei rA, value = twi 6, rA, value
    Twi(u32, u32, u32, u32, u32),
}