Включите функцию библиотеки C в Perl6 с NativeCall - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь использовать 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);

Это работает для первого числа (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.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Ошибки с собственными значениями не всегда очевидны.

В основном это говорит о том, что Крыса не является Числом.

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
0 голосов
/ 27 декабря 2018

Ваш $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

...