Sum*_*nal 10 rakudo nativecall raku
multi我正在尝试在 Raku 代码中使用将函数包装在 中的函数C。\n这里我正在调用lchoose共享库中的函数。\n这是我的有效Rmath代码:
use NativeCall;\n\nconstant RMATH = "./Rmath"; # shared library\nsub lchoose(num64, num64) returns num64 \n        is native( RMATH ) { * };\n\n# The C function signature is \n# double    lchoose(double, double);\n\nsub r_lchoose($n,$r) {\n        return lchoose($n.Num, $r.Num)\n}\n\nsay r_lchoose(9,8) # 2.1972245773362196\n但这是行不通的。代码继续运行/挂起。既不死亡也不抛出任何输出:
\n\nuse NativeCall;\n\nconstant RMATH = "./Rmath"; # shared library\nmulti lchoose(num64, num64) returns num64 \n        is native( RMATH ) { * };\n\nmulti lchoose($n,$r) {\n        lchoose($n.Num, $r.Num)\n}\n\nsay lchoose(9,8) # Neither dies nor throws any output\n我的期望是当我调用lchoose(9,8)它时应该调用第二个 multi 因为参数绝对不是num64。如果它使用了第二个函数,那么它将调用第一个函数并给出输出。
或者至少我希望程序抛出错误而不是挂起。
\nWindows 11 64 位
\nWelcome to Rakudo\xe2\x84\xa2 v2022.04.0000.1.\nImplementing the Raku\xc2\xae Programming Language v6.d.\nBuilt on MoarVM version 2022.04-3-ga9fcd5a74.\nEli*_*sen 10
num64签名中的A表示它必须具有num64才能使多调度工作。否则,您无法为 a 设置候选项Num:D 并num64为或找到候选项num32。
并且由于您的示例中没有候选者Num,因此它将分派回原始候选者,从而导致无限循环。
因此,我会将“包罗万象”的 lchoose 候选人写为:
multi lchoose(Num() $n, Num() $r) {
    lchoose(my num64 $ = $n, my num64 $ = $r)
}
在签名中,我们将所有内容都转换为Num,然后将它们分配给num64调用其他候选者的无名本机变量(现在将正确分派)。