多次调度给候选人,但本机参数不起作用

Sum*_*nal 10 rakudo nativecall raku

multi我正在尝试在 Raku 代码中使用将函数包装在 中的函数C。\n这里我正在调用lchoose共享库中的函数。\n这是我的有效Rmath代码:

\n
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
Run Code Online (Sandbox Code Playgroud)\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
Run Code Online (Sandbox Code Playgroud)\n

我的期望是当我调用lchoose(9,8)它时应该调用第二个 multi 因为参数绝对不是num64。如果它使用了第二个函数,那么它将调用第一个函数并给出输出。

\n

或者至少我希望程序抛出错误而不是挂起。

\n

操作系统信息

\n

Windows 11 64 位

\n

乐信息

\n
Welcome 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.\n
Run Code Online (Sandbox Code Playgroud)\n

Eli*_*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)
}
Run Code Online (Sandbox Code Playgroud)

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

  • 的确。“Num()”是“Num(Any)”的缩写,意思是:接受“Any”,并强制为“Num”。例如:`my Num() $a = 42; dd $a; # 42e0`。它也称为[强制类型](https://docs.raku.org/type/Signature#index-entry-Coercion_type) (3认同)
  • `Num()` 在函数签名 `multi lchoose(Num() $n, Num() $r)` 中做什么?是否在继续之前将“$n”或“$r”转换为“Num”? (2认同)
  • 想知道对 ```lchoose(...)``` 的调用是否可以是 ```nextwith(...)``` - 这会抑制无限循环吗? (2认同)