如何编写 Rust 宏将行优先顺序转换为列优先顺序?
How can I write a Rust macro to convert row-major order to column-major order?
该宏允许您以自然的方式编写任何 M x N 矩阵。例如:
matrix![
1.0, 3.0, 5.0;
2.0, 4.0, 6.0;
]
对应如下矩阵
┌ ┐
│ 1.0 3.0 5.0 │
│ 2.0 4.0 6.0 │
└ ┘
该宏将输出如下数组:
[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]
我知道我可以使用以下命令非常简单地解析行优先顺序。但是我怎样才能将其转换为列优先顺序。我不知道如何切换重复组的顺序。
macro_rules! matrix {
($($($e:expr),*);*) => {(
[$([$($e),*]),*]
}
}
Here你去:
macro_rules! matrix {
($($($v:expr),* );*) => {
matrix!(@phase2 [] $($($v),* );*)
};
(@phase2 [$([$($col:expr),*])*] $($v:expr);* ) => {
[$([$($col),*],)* [$($v),*]]
};
(@phase2 [$([$($col:expr),*])*] $($v0:expr, $($v:expr),* );* $(;)?) => {
matrix!(@phase2 [$([$($col),*]),* [$($v0),*]] $($($v),* );*)
};
}
该宏允许您以自然的方式编写任何 M x N 矩阵。例如:
matrix![
1.0, 3.0, 5.0;
2.0, 4.0, 6.0;
]
对应如下矩阵
┌ ┐
│ 1.0 3.0 5.0 │
│ 2.0 4.0 6.0 │
└ ┘
该宏将输出如下数组:
[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]
我知道我可以使用以下命令非常简单地解析行优先顺序。但是我怎样才能将其转换为列优先顺序。我不知道如何切换重复组的顺序。
macro_rules! matrix {
($($($e:expr),*);*) => {(
[$([$($e),*]),*]
}
}
Here你去:
macro_rules! matrix {
($($($v:expr),* );*) => {
matrix!(@phase2 [] $($($v),* );*)
};
(@phase2 [$([$($col:expr),*])*] $($v:expr);* ) => {
[$([$($col),*],)* [$($v),*]]
};
(@phase2 [$([$($col:expr),*])*] $($v0:expr, $($v:expr),* );* $(;)?) => {
matrix!(@phase2 [$([$($col),*]),* [$($v0),*]] $($($v),* );*)
};
}