首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C库函数与Perl6与NativeCall的结合

C库函数与Perl6与NativeCall的结合
EN

Stack Overflow用户
提问于 2018-12-27 03:56:39
回答 2查看 216关注 0票数 3

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

我如何将它合并到Perl6中呢?

我试过了

代码语言:javascript
复制
use NativeCall;

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

say lgamma(3e0);

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

这对于第一个数字(一个Str)有效,但是对于第二个数字,$x失败,给出了错误:

代码语言:javascript
复制
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中这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-27 19:43:10

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

基本上,它是说老鼠不是一个名词。

3.14是一只老鼠。(理性)

代码语言:javascript
复制
say 3.14.^name; # Rat
say 3.14.nude.join('/'); # 157/50

每次你叫它的时候,你都可以强迫它的价值为Num。

代码语言:javascript
复制
lgamma( $x.Num )

看上去不太好。

我只想把本地的子包在另一个,强制所有的实数为Num。

(除了复数外,所有数字都是真实的)

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2018-12-27 13:02:03

您的$x没有类型。如果你对它使用任何类型,比如num64,它会说:

代码语言:javascript
复制
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)

所以你就是这么做的

代码语言:javascript
复制
my  num64 $x = 3.14.Num;

这将准确地将数字转换为lgamma所需的表示形式。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53939570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档