使用 NativeCall 将 C 库函数合并到 Perl6 中

2024-02-25

我正在尝试使用lgamma来自 C 的math.h在 Perl6 中。

我如何将其合并到 Perl6 中?

我努力了

use NativeCall;

sub lgamma(num64 --> num64) is native(Str) {};

say lgamma(3e0);

my $x = 3.14;
say lgamma($x);

这适用于第一个数字(aStr)但第二次失败,$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 中做到这一点。


原生值的错误并不总是很清楚。

基本上它是在说老鼠不是数字。

3.14是一只老鼠。 (合理的)

say 3.14.^name; # Rat
say 3.14.nude.join('/'); # 157/50

每次调用时,您都可以将值强制为 Num 。

lgamma( $x.Num )

这看起来不太好。


我只是将本机子程序包装在另一个子程序中,将所有实数强制转换为 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NativeCall 将 C 库函数合并到 Perl6 中 的相关文章

随机推荐