我不明白为什么该程序有效:
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) 我正在对复杂数组编写测试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)
是否有一个简单的解释或者这是一个错误?
我发现了超级操作员的这种奇怪行为:
\nsay 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]\nRun Code Online (Sandbox Code Playgroud)\n中缀运算符在这里!=定义为等价于 !==,但显然它不是,至少在超级运算符中使用时是这样。
该问题似乎与特定值(零)有关,因为使用不同的值会返回预期结果。\n此外,使用0 but True工作正常:
@a = 0 but True, 0 but True, 0 but True;\nsay @a \xc2\xab!=\xc2\xbb @a; # [False False False]\nRun Code Online (Sandbox Code Playgroud)\n我正在使用 Rakudo 2022.03。
\n这是一个错误还是我无法理解的东西?
\n我有这个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)
有什么建议吗?
在我正在编写的模块中,只有一种方法需要附加模块,因此我希望通过不在dependsMETA6.json 文件的一部分中列出该模块来使该模块成为可选。如果可选模块不可用,该方法将返回一个 Failure 对象。
我知道我可以做这样的事情:
if (try require Optional::Module) !=== Nil {
# go on
} else {
# fail
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?
当我执行此程序时:
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)