3

我正在尝试在 Perl6中使用lgammaC 语言。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 中做到这一点。

4

2 回答 2

6

本机值的错误并不总是很清楚。

基本上它是在说 Rat 不是 Num。

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
于 2018-12-27T19:43:10.570 回答
5

$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

于 2018-12-27T13:02:03.673 回答