小编Fer*_*ata的帖子

对序列中的供应做出反应

我不明白为什么该程序有效:

my $supply = Supply.interval: 1;

react {
  whenever $supply       { put "Got $^a"  }
  whenever Promise.in(5) { put 'Timeout!'; done }
}

END put 'Ending…'
Run Code Online (Sandbox Code Playgroud)

打印此:

Got 0
Got 1
Got 2
Got 3
Got 4
Timeout!
Ending…
Run Code Online (Sandbox Code Playgroud)

并正确退出,而这一步:

my $supply = (1, 1, * + * … ?).Supply;

react {
  whenever $supply       { put "Got $^a"; sleep 1 }
  whenever Promise.in(5) { put 'Timeout!'; done }
}

END put 'Ending…'
Run Code Online (Sandbox Code Playgroud)

版画

Got 1
Got 1
Got 2
Got …
Run Code Online (Sandbox Code Playgroud)

sequence perl6

6
推荐指数
0
解决办法
126
查看次数

使用元运算符进行测试不会打印测试描述

我正在对复杂数组编写测试Z?,当我注意到缺少测试描述时,我正在使用运算符检查数组是否大致相等。
我试图对这段代码进行分析,以找出显示我所看到的结果的最简单的情况。即使我使用 Num 或 Int 变量和Z==运算符,第二个测试中也缺少描述。

use Test;

my @a = 1e0, 3e0;
my @b = 1e0, 3e0;
ok @a[0] == @b[0], 'description1';     # prints: ok 1 - description1
ok @a[^2] Z== @b[^2], 'description2';  # prints: ok 2 -

done-testing;
Run Code Online (Sandbox Code Playgroud)

是否有一个简单的解释或者这是一个错误?

testing raku

6
推荐指数
1
解决办法
45
查看次数

超级算子的奇怪行为

我发现了超级操作员的这种奇怪行为:

\n
say 0 != 0;                 # False\n\nmy @a = 0, 0, 0;\nsay @a \xc2\xab==\xc2\xbb @a;             # [True True True]\nsay @a \xc2\xab!=\xc2\xbb @a;             # [True True True] <--- why?\nsay @a \xc2\xab!==\xc2\xbb @a;            # [False False False]\n
Run Code Online (Sandbox Code Playgroud)\n

中缀运算符在这里!=定义为等价于 !==,但显然它不是,至少在超级运算符中使用时是这样。

\n

该问题似乎与特定值(零)有关,因为使用不同的值会返回预期结果。\n此外,使用0 but True工作正常:

\n
@a = 0 but True, 0 but True, 0 but True;\nsay @a \xc2\xab!=\xc2\xbb @a;             # [False False False]\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用 Rakudo 2022.03。

\n

这是一个错误还是我无法理解的东西?

\n

raku

6
推荐指数
1
解决办法
116
查看次数

如何为返回完整结构的C函数编写Raku声明?

我有这个C代码:

typedef struct {
  double dat[2];
} gsl_complex;

gsl_complex gsl_poly_complex_eval(const double c[], const int len, const gsl_complex z);
Run Code Online (Sandbox Code Playgroud)

C函数返回整个结构,而不仅仅是指针,因此我不能将Raku声明写为:

sub gsl_poly_complex_eval(CArray[num64] $c, int32 $len, gsl_complex $z --> gsl_complex)
  is native(LIB) is export { * }
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

nativecall raku

5
推荐指数
2
解决办法
76
查看次数

检查可选模块可用性的最佳方法

在我正在编写的模块中,只有一种方法需要附加模块,因此我希望通过不在dependsMETA6.json 文件的一部分中列出该模块来使该模块成为可选。如果可选模块不可用,该方法将返回一个 Failure 对象。
我知道我可以做这样的事情:

if (try require Optional::Module) !=== Nil {
  # go on
} else {
  # fail
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点?

module raku

5
推荐指数
1
解决办法
101
查看次数

以不同顺序执行时测试失败

当我执行此程序时:

use Test;
use NativeCall;

constant LIB  = ('gsl', v23);

sub gsl_sf_airy_Ai(num64 $x, uint32 $mode --> num64) is native(LIB) is export { * }
sub Ai(Numeric $x, UInt $mode --> Num) is export { gsl_sf_airy_Ai($x.Num, $mode) }

ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';
ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';
Run Code Online (Sandbox Code Playgroud)

即使我以这种方式交换两个“确定”的测试,测试也可以正常工作:

ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';
ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';
Run Code Online (Sandbox Code Playgroud)

如果我将声明移至模块:

unit module mymodule;
use NativeCall;

constant LIB  = ('gsl', v23);

sub gsl_sf_airy_Ai(num64 $x, …
Run Code Online (Sandbox Code Playgroud)

testing raku

4
推荐指数
1
解决办法
41
查看次数

标签 统计

raku ×5

testing ×2

module ×1

nativecall ×1

perl6 ×1

sequence ×1