加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:15:04 所属栏目:百科 来源:网络整理
导读:我试图在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); 这适用于第一个数字(一个Str),但对于第二个,$x失败,给出错误: This
我试图在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);

这适用于第一个数字(一个Str),但对于第二个,$x失败,给出错误:

This type cannot unbox to a native number: P6opaque,Rat
  in block <unit> at pvalue.p6 line 8

我想这样做很简单,就像在Perl5中一样:使用POSIX’lgamma’;然后lgamma($x),但我不知道如何在Perl6中做到这一点.

解决方法

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

基本上它是说老鼠不是一个数字.

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

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

每次调用它时,你总是可以将值强制为Num.

lgamma( $x.Num )

这似乎并不那么好.

我只是将原生子包裹在另一个中,将所有实数转换为Num.
(Real是除Complex之外的所有数字)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读