raku - 使用 NativeCall 将 C 库函数并入 Perl6

标签 raku nativecall

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

我如何将其合并到 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 中做到这一点。

最佳答案

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

基本上是说老鼠不是数字。
3.14是一只老鼠。 (合理的)

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

每次调用它时,您都可以始终将值强制为 Num。

lgamma( $x.Num )

那似乎不太好。

我只是将 native 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

关于raku - 使用 NativeCall 将 C 库函数并入 Perl6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53939570/

相关文章:

visual-studio - Perl6 NativeCall 在 native 库中找不到符号

Raku:如何为 CArray[WCHAR] 赋值?

raku - native 调用。如何获取一个字符串作为C函数的参数

constants - 将 ⊤ ("down tack") 字符定义为我可以在我的程序中使用的常量

raku - 如何在Perl 6的 "map"循环内使用 "for"?

text - 使用Perl6处理大文本文件,太慢了。(2014-09)

macros - 宏定义中的"Too few positionals"

Raku 如何将指向 Buf 的指针传递给本地调用进行写入

raku - 如何将 CArray[ of-struct] 从 Raku 传递给 C?

raku - 实例化一个 Raku 类,并在构造函数中更新一个实例变量