无法将参数转发给嵌套的宏
Can't forward parameters to nested macros
我正在研究 Rust 宏以生成描述 FFI 回调的静态结构数组。我目前拥有的是...
// some trivial callback functions
extern "C" fn my_fun_1(argc: u32, argv: *const i32) -> i32 { 1 }
extern "C" fn my_fun_2(argc: u32, argv: *const i32) -> i32 { 2 }
// create static array of ErlNifFunc describing above callbacks
nif_init!(b"my_module[=10=]",
nif!(b"my_fun_1[=10=]", 3, my_fun_1),
nif!(b"my_fun_2[=10=]", 5, my_fun_2));
(整件事是 here)
之所以可行,是因为我只需要对提供给 nif!
宏的信息进行一次扩展。但是现在,除了生成结构数组之外,我还想为提供的函数生成包装函数。因此,我无法立即调用 nif!
,因为我现在需要对基础参数进行不止一次的扩展传递。我实际上需要将 nif!
调用移到 nif_init!
内,这就是我淹没的地方。我认为顶层 nif_init!
需要看起来像这样...
nif_init!(b"my_module[=11=]",
(b"my_fun_1[=11=]", 3, my_fun_1),
(b"my_fun_2[=11=]", 5, my_fun_2));
... 将带括号的内部参数传递给子宏,但我就是做不到。完全不工作的东西是 here。澄清一下,这个版本只是试图在内部进行宏调用。我还没有尝试生成任何包装函数。
对于这种情况,您不能将括号用作分组,您需要将它们用作宏模式的一部分。我会避免使用括号来避免这种混淆。
在这里,我稍微更改了您的宏以接受零组或多组 {}
。您可以对它们中的每一个进行宏迭代并调用您的内部宏:
macro_rules! nif_inner {
($name:expr, $args:expr, $meth:expr) => ()
}
macro_rules! nif_init {
($module:expr, $({ $name:expr, $args:expr, $meth:expr }),*) => (
$(nif_inner!(name, $args, $meth);)*
)
}
nif_init!(
"hello",
{ "name1", 1, true },
{ "name2", 2, false }
);
fn main() {}
我正在研究 Rust 宏以生成描述 FFI 回调的静态结构数组。我目前拥有的是...
// some trivial callback functions
extern "C" fn my_fun_1(argc: u32, argv: *const i32) -> i32 { 1 }
extern "C" fn my_fun_2(argc: u32, argv: *const i32) -> i32 { 2 }
// create static array of ErlNifFunc describing above callbacks
nif_init!(b"my_module[=10=]",
nif!(b"my_fun_1[=10=]", 3, my_fun_1),
nif!(b"my_fun_2[=10=]", 5, my_fun_2));
(整件事是 here)
之所以可行,是因为我只需要对提供给 nif!
宏的信息进行一次扩展。但是现在,除了生成结构数组之外,我还想为提供的函数生成包装函数。因此,我无法立即调用 nif!
,因为我现在需要对基础参数进行不止一次的扩展传递。我实际上需要将 nif!
调用移到 nif_init!
内,这就是我淹没的地方。我认为顶层 nif_init!
需要看起来像这样...
nif_init!(b"my_module[=11=]",
(b"my_fun_1[=11=]", 3, my_fun_1),
(b"my_fun_2[=11=]", 5, my_fun_2));
... 将带括号的内部参数传递给子宏,但我就是做不到。完全不工作的东西是 here。澄清一下,这个版本只是试图在内部进行宏调用。我还没有尝试生成任何包装函数。
对于这种情况,您不能将括号用作分组,您需要将它们用作宏模式的一部分。我会避免使用括号来避免这种混淆。
在这里,我稍微更改了您的宏以接受零组或多组 {}
。您可以对它们中的每一个进行宏迭代并调用您的内部宏:
macro_rules! nif_inner {
($name:expr, $args:expr, $meth:expr) => ()
}
macro_rules! nif_init {
($module:expr, $({ $name:expr, $args:expr, $meth:expr }),*) => (
$(nif_inner!(name, $args, $meth);)*
)
}
nif_init!(
"hello",
{ "name1", 1, true },
{ "name2", 2, false }
);
fn main() {}