我试图在 Perl6 中使用来自 C 的 lgamma
的 math.h
。
我如何将其合并到 Perl6 中?
我试过了
use NativeCall;
sub lgamma(num64 --> num64) is native(Str) {};
say lgamma(3e0);
my $x = 3.14;
say lgamma($x);
这适用于第一个数字(a
Str
)但对于第二个 $x
失败,给出错误:This type cannot unbox to a native number: P6opaque, Rat
in block <unit> at pvalue.p6 line 8
我想非常简单地做到这一点,就像在 Perl5 中一样:
use POSIX 'lgamma';
然后是 lgamma($x)
但我不知道如何在 Perl6 中做到这一点。 最佳答案
native 值的错误并不总是很清楚。
基本上是说老鼠不是数字。3.14
是一只老鼠。 (合理的)
say 3.14.^name; # Rat
say 3.14.nude.join('/'); # 157/50
每次调用它时,您都可以始终将值强制为 Num。
lgamma( $x.Num )
这似乎不太好。
我只是将 native sub 包装在另一个将所有实数强制为 Num 的子中。
(实数是除复数外的所有数字)
sub lgamma ( Num(Real) \n --> Num ){
use NativeCall;
sub lgamma (num64 --> num64) is native {}
lgamma( n )
}
say lgamma(3); # 0.6931471805599453
say lgamma(3.14); # 0.8261387047770286
关于raku - 使用 NativeCall 将 C 库函数并入 Perl6,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53939570/