如何在Rust的宏系统中求值表达式?

只要

我试图通过编写基于一些无符号整型一个简单的宏产生一个结构来学习锈病宏系统(u8u16u32u64)。我想要这样的东西:

bitmessage! {
    struct Header(u16);
    version: 8, 5; // the first number is the length, second is value
    data: 8, 5;
}

更具体地说,我正在寻找一种将某些信息存储在具有各种偏移量的无符号整数类型中的方法。一个用例是读取一些字节并构造某种“消息”:

[ 15 14 13 12 11 10 09 08 | 07 06 05 04 03 02 01 01 ]

消息的较高部分包含一些数据/信息,较低部分包含版本控制字段。(这只是一个玩具示例)。

到目前为止,这是我的努力,但是内部重复扩展无法编译:

macro_rules! bitmessage {
(struct $name:ident($n:ty); 
    $($field_name:ident: $length:expr, $value:expr;)*)  => {
         struct $name ($n);
         $($name.1 = $name.1 | $value << $length)*
    };
}

一种解决方案是将相关字节存储在结构中,直接实现(或使用特征)以获取适当的字段,但这将涉及过多的移位逻辑(这没有问题,但是必须有更多的逻辑)方便的方式)。

我知道位标志位域它们都不符合我的用例。

Shepmaster

声明性宏(macro_rules

您不能在声明性宏中计算表达式。声明性宏仅在输入代码的抽象语法树(AST)的各个部分中创建,删除或移动。在宏扩展期间不会进行任何评估(即使名称为“ expansion”也只是提示)。

最好的办法是在宏展开后创建可在编译时评估的代码。在编译时有效的代码子集是有限的,但将来会增长。

程序宏

程序宏更复杂,但功能更强大。这些被实现为任意Rust代码,它们可以解析任意Rust代码,输出更多任意Rust代码。

但是,无法重用评估Rust代码的常规方法。您将必须接受文字值并自己进行所有计算。

您的具体示例

尚不清楚您希望宏的结果是什么。请记住,宏没有能力“组合”新的Rust概念,它们仅允许您用更少的字符表示现有的重复概念。

因此,我总是建议人们将前两个重复的案例完全写出来这迫使您编写完整的有效Rust代码并识别它们之间的差异。然后,您可以使用任何常规的Rust技术提取共性。

也可以看看:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Rust宏中匹配表达式的类型?

如何在宏中匹配Rust的`if`表达式?

如何在J中重复对表达式的求值?

如何在AngularJS中的表达式内部求值

如何在常量求值表达式中获得编译时错误?

如何在使用递归方案编写的表达式求值器中编写更少的样板

下面的表达式将如何在C中求值?

如何用R中的变量求值表达式?

可变的宏和/或模板和/或函数如何捕获表达式及其求值?

为什么仍然对ifelse宏的“错误”表达式求值?

lisp宏可构建表达式列表及其求值

如何使“at()”函数对表达式求值?

printf 函数中的表达式求值

AngularJS中布尔表达式的求值

如何在调试器中逐步执行对表达式的求值,而无需为其创建脚本?

Mule ESB-如何在自定义Java转换器中求值表达式

如何在 asciidoc 中为 mathjax 表达式定义自定义宏?

宏中的正则表达式如何操作?

在Julia中,是否有一个宏来确定表达式是否可以在解析时求值?

表达式求值顺序

Xtext 求值表达式

如何在Rust中获得重叠的正则表达式捕获?

如何在Rust中同时打印表达式及其值?

如何在系统Verilog中的Enum中使用算术表达式?

在表达式求值过程中,运算符的结合性如何工作?

Haskell中的求值如何对带有约束的表达式起作用

如何从终端(不是REPL)求值Julia表达式?

隔离正则表达式如何求值

Python-如何对以下表达式求值?