是否可以编写一个扩展表达式N次的宏? (其中N是常数)

时间:2016-09-06 10:29:51

标签: macros rust

假设我们需要使用值声明一个固定大小的数组,其中数组的大小由一个常量定义,该常量可能会根据编译时设置而改变。

例如:

let my_array = expand_into_array!(j, ARRAY_SIZE, -v0[j] * f);

ARRAY_SIZE是常量,例如: const ARRAY_SIZE: usize = 3;

可以扩展为类似......

let my_array = [
    {let j = 0; {-v0[j] * f}},
    {let j = 1; {-v0[j] * f}},
    {let j = 2; {-v0[j] * f}},
];

由于表达式是固定大小的数组,因此可以对有限数量的项目使用模式匹配...例如,最多32个。

是否可以根据常量整数编写一个扩展表达式 N 次的宏?

详情...

调查一下,我编写了一个定义数组的宏,然后将其填入,例如:

const ARRAY_SIZE: usize = 3;

macro_rules! expand_into_array {
    ($index_var:ident, $const_size:expr, $body:expr) => {
        {
            let mut tmp: [_; $const_size] = [0.0; $const_size];
            for $index_var in 0..$const_size {
                tmp[$index_var] = $body;
            }
            // TODO, check $body _never_ breaks.
            tmp
        }
    }
}

pub fn negated_array(v0: &[f64; ARRAY_SIZE]) -> [f64; ARRAY_SIZE] {
    expand_into_array!(j, ARRAY_SIZE, {
        -v0[j]
    })
}

这可以按预期工作,除了皱纹($body表达式可以包含break)。这没有问题。

然而,将数组初始化为0.0并未进行优化(更改此值会在运行时显示为更改:
cargo rustc --release -- --emit asm

我宁愿不使用unsafe { std::mem::uninitialized }

更新,从询问another question,似乎宏只能匹配文字,而不是常量。

所以这对于Rust中的宏来说根本不可能。

0 个答案:

没有答案