使用 NativeCall 将 C 库函数整合到 Perl6 中
Incorporate C library function into Perl6 with NativeCall
我正在尝试在 Perl6 中使用 C 的 math.h
中的 lgamma
。
我如何将其合并到 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 中做到这一点。
您的 $x
没有类型。如果你为它使用任何类型,比如 num64
,它会说:
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)
所以你就是这么做的:
my num64 $x = 3.14.Num;
这会将数字准确地转换为 lgamma
所需的表示形式
原始值的错误并不总是很清楚。
基本上是说 Rat 不是 Num。
3.14
属鼠。 (有理数)
say 3.14.^name; # Rat
say 3.14.nude.join('/'); # 157/50
您每次调用时都可以将值强制转换为 Num。
lgamma( $x.Num )
好像不太好。
我只是将原生 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
我正在尝试在 Perl6 中使用 C 的 math.h
中的 lgamma
。
我如何将其合并到 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 中做到这一点。
您的 $x
没有类型。如果你为它使用任何类型,比如 num64
,它会说:
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)
所以你就是这么做的:
my num64 $x = 3.14.Num;
这会将数字准确地转换为 lgamma
原始值的错误并不总是很清楚。
基本上是说 Rat 不是 Num。
3.14
属鼠。 (有理数)
say 3.14.^name; # Rat
say 3.14.nude.join('/'); # 157/50
您每次调用时都可以将值强制转换为 Num。
lgamma( $x.Num )
好像不太好。
我只是将原生 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