多分派给候选人,本机参数不起作用

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/hangingdies 也不会抛出任何 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 设置候选项 num64num32

并且因为在你的例子中没有 Num 的候选项,它会派发回原来的候选项,导致无限循环。

因此,我会将“catch-all”lchoose candidate 写为:

multi lchoose(Num() $n, Num() $r) {
    lchoose(my num64 $ = $n, my num64 $ = $r)
}

在签名中,我们将所有内容都转换为 Num,然后我们将这些分配给调用另一个候选者(现在将正确调度)中的无名本机 num64 变量。