通过NativeCall将C库函数合并到Perl6中

时间:2018-12-27 03:56:40

标签: perl6 nativecall

我正在尝试在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);

这适用于第一个数字(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中做到这一点。

2 个答案:

答案 0 :(得分:6)

带有原始值的错误并不总是很清楚。

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

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

答案 1 :(得分:5)

Your $x has no type. If you use any type for it, say num64, it will say:

Cannot assign a literal of type Rat (3.14) to a native variable of type num. You can declare the variable to be of type Real, or try to coerce the value with 3.14.Num or Num(3.14)

So you do exactly that:

my  num64 $x = 3.14.Num;

This converts the number exactly to the representation that is required by lgamma