多分派给候选人,本机参数不起作用
Multi-dispatch to candidate with native parameters not working
我正在尝试在我的 Raku 代码中使用 multi
,它在 C
中包装了一个函数。
在这里,我在共享库 Rmath
中调用 lchoose
函数。
这是我的代码,有效:
use NativeCall;
constant RMATH = "./Rmath"; # shared library
sub lchoose(num64, num64) returns num64
is native( RMATH ) { * };
# The C function signature is
# double lchoose(double, double);
sub r_lchoose($n,$r) {
return lchoose($n.Num, $r.Num)
}
say r_lchoose(9,8) # 2.1972245773362196
但这不起作用。代码保持在running/hanging。 dies 也不会抛出任何 output:
use NativeCall;
constant RMATH = "./Rmath"; # shared library
multi lchoose(num64, num64) returns num64
is native( RMATH ) { * };
multi lchoose($n,$r) {
lchoose($n.Num, $r.Num)
}
say lchoose(9,8) # Neither dies nor throws any output
我的期望是,当我调用 lchoose(9,8)
时,它应该调用第二个 multi,因为参数绝对不是 num64
。如果它使用了第二个函数,那么它会调用第一个函数并给出输出。
或者至少我希望程序抛出错误而不是挂起。
OS 信息
Windows 11 64 位
乐信息
Welcome to Rakudo™ v2022.04.0000.1.
Implementing the Raku® Programming Language v6.d.
Built on MoarVM version 2022.04-3-ga9fcd5a74.
签名中的 num64
表明它 必须 具有 num64
才能使多分派工作。否则,您无法为 Num:D
和 设置候选项 num64
或 num32
。
并且因为在你的例子中没有 Num
的候选项,它会派发回原来的候选项,导致无限循环。
因此,我会将“catch-all”lchoose candidate 写为:
multi lchoose(Num() $n, Num() $r) {
lchoose(my num64 $ = $n, my num64 $ = $r)
}
在签名中,我们将所有内容都转换为 Num
,然后我们将这些分配给调用另一个候选者(现在将正确调度)中的无名本机 num64
变量。
我正在尝试在我的 Raku 代码中使用 multi
,它在 C
中包装了一个函数。
在这里,我在共享库 Rmath
中调用 lchoose
函数。
这是我的代码,有效:
use NativeCall;
constant RMATH = "./Rmath"; # shared library
sub lchoose(num64, num64) returns num64
is native( RMATH ) { * };
# The C function signature is
# double lchoose(double, double);
sub r_lchoose($n,$r) {
return lchoose($n.Num, $r.Num)
}
say r_lchoose(9,8) # 2.1972245773362196
但这不起作用。代码保持在running/hanging。 dies 也不会抛出任何 output:
use NativeCall;
constant RMATH = "./Rmath"; # shared library
multi lchoose(num64, num64) returns num64
is native( RMATH ) { * };
multi lchoose($n,$r) {
lchoose($n.Num, $r.Num)
}
say lchoose(9,8) # Neither dies nor throws any output
我的期望是,当我调用 lchoose(9,8)
时,它应该调用第二个 multi,因为参数绝对不是 num64
。如果它使用了第二个函数,那么它会调用第一个函数并给出输出。
或者至少我希望程序抛出错误而不是挂起。
OS 信息
Windows 11 64 位
乐信息
Welcome to Rakudo™ v2022.04.0000.1.
Implementing the Raku® Programming Language v6.d.
Built on MoarVM version 2022.04-3-ga9fcd5a74.
签名中的 num64
表明它 必须 具有 num64
才能使多分派工作。否则,您无法为 Num:D
和 设置候选项 num64
或 num32
。
并且因为在你的例子中没有 Num
的候选项,它会派发回原来的候选项,导致无限循环。
因此,我会将“catch-all”lchoose candidate 写为:
multi lchoose(Num() $n, Num() $r) {
lchoose(my num64 $ = $n, my num64 $ = $r)
}
在签名中,我们将所有内容都转换为 Num
,然后我们将这些分配给调用另一个候选者(现在将正确调度)中的无名本机 num64
变量。