我想创建一个Perl 6模块,它将一个LEAVE移相器"导出" 到use放置语句的作用域.我还没有办法做到这一点.
我认为这需要在EXPORT子内部完成,但如何?EXPORTsub 的默认功能是返回一个Map名称=>要导出的事物的对象映射.据我所知,没有办法反省外部范围.或者我错过了什么?
如果一个 try{} 块中发生多个异常,并且该 try{} 块内只有一个 CATCH{} 块,那么该 CATCH{} 块是否可以捕获任何/所有异常?或者我是否需要针对每个可能的异常使用一个 CATCH{}?
try { CATCH { default { say "seenError" }; }; die "1"; die "2"; die "3" }
seenError
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,哪个“die”语句被捕获了?第一?如果我想处理每个异常,是否需要将每个可能的异常包含在一个单独的 CATCH{} 中?
我正在尝试为X::NYI该类编写一个示例作为对此问题的响应.我想出了这样的事情:
class Nothing {
sub postfix:<.&>( $sub, **@args) {
die X::NYI.new( feature => $sub,
did-you-mean => "nothing",
workaround => "Implement it yourself" );
}
}
my $let's-see = Nothing.newish;
Run Code Online (Sandbox Code Playgroud)
这是尝试重新实现方法调用postfix运算符为所调用的任何东西抛出异常.这不起作用:
No such method 'newish' for invocant of type 'Nothing'
Run Code Online (Sandbox Code Playgroud)
在NYI.p6第13行的街区
事实上,文档说:
从技术上讲,不是真正的运营商; 它的语法特殊于编译器.
这很可能意味着它无法被覆盖.这也意味着做我想做的事情意味着与元模型交互以拦截类解析方法.但我真的不知道如何做到这一点.在Rakudo源大部分的例子,比如这一个,抛出该异常时的具体函数被调用,并且,事实上,我们看到的异常被抛出dispatch在方法Mu层面.
那么最重要的dispatch是做出这种事情的正确方法吗?还是别的什么完全不同?
“ CATCH”是否应该在“ throw”之后严格调用?
范例1:
say 'Hello World!';
class E is Exception { method message() { "Just stop already!" } }
CATCH {
when E {
.resume;
}
}
E.new.throw;
Run Code Online (Sandbox Code Playgroud)
错误:
找不到方法“接收器”:在/tmp/739536251/main.pl6第11行的块中没有方法缓存,也没有。^ find_method
范例2:
say 'Hello World!';
class E is Exception { method message() { "Just stop already!" } }
E.new.throw;
CATCH {
when E {
.resume;
}
}
Run Code Online (Sandbox Code Playgroud)
没错
它似乎在2019年10月的某个地方停止了。我认为Perl 6的开发仍在继续。那么,为什么没有更多人问有关Perl 6的问题了?
我试图在一个数字中找到一组重复的数字,例如12334555611变成(1 2 33 4 555 6 11).
这有效:
$n.comb(/ 0+ | 1+ | 2+ | 3+ | 4+ | 5+ | 6+ | 7+ | 8+ | 9+ /)
Run Code Online (Sandbox Code Playgroud)
但不是很优雅。
有一个更好的方法吗?
在 Raku 文档中关于供应方法法案(vs tap) https://docs.raku.org/type/Supply#method_act指出:
给定的代码保证一次只由一个线程执行
我的理解是一个线程必须在另一个线程必须运行它之前完成特定的代码对象。
如果是这种情况,我在尝试实现该功能时偶然发现了不同的行为。看看下面的代码片段,其中创建了 2 个“行为”并在不同的线程中运行:
#!/usr/bin/env perl6
say 'Main runs in [ thread : ', +$*THREAD, ' ]';
my $b = 1;
sub actor {
print " Tap_$*tap : $^a ", now;
$*tap < 2 ??
do {
say " - Sleep 0.1";
sleep 0.1
}
!!
do {
say " - Sleep 0.2";
sleep 0.2;
}
$b++;
say " Tap_$*tap +1 to \$b $b ", now;
}
my $supply = supply …Run Code Online (Sandbox Code Playgroud) 我已经尝试在raku OOP中编写了yangyanzhan的raku-riddle-contest解决方案。Raku 类系统非常直观,在我遇到递归函数之前,一切都很有趣。这是类和函数的代码版本:
class Encounters {
has $.tigers;
has @!encounters;
method encounters {
if @!encounters.elems eq $.tigers {
return [@!encounters, ];
}
my @total_encounters = [] ;
for 1..$.tigers -> $tiger {
if ($tiger / 2) eq ($tiger / 2).round {
@!encounters = ( @!encounters, [$tiger]).flat ;
my @encounter_events = Encounters.new( tigers => $.tigers, encounters => @!encounters ).encounters;
@total_encounters.append: @encounter_events;
}
}
return @total_encounters;
}
}
sub encounters($tigers, @encounters) {
if @encounters.elems eq $tigers {
return …Run Code Online (Sandbox Code Playgroud) 我正在使用 Raku 2020.10。
根据此页面,https://docs.raku.org/language/regexes#Longest_alternation:_| , "|" 或带引号的列表是最长的匹配项。
> say "youtube" ~~ / < you tube > /
?you? # expected "tube" to win the match
> say "youtube" ~~ / you | tube /
?you? # expected "tube" to win the match
> say "youtube" ~~ / tube | you /
?you? # expected "tube" to win the match
Run Code Online (Sandbox Code Playgroud)
现在尝试“||” 而不是“|”:
> say "tubeyou" ~~ / you || tube /
?tube? # longest match or first match?
> say …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现光谱范数基准游戏,下面是我的 Raku 实现。它严格遵循此处的 Python 实现。它产生正确的结果,但是,它是如此缓慢。例如,当输入为 200 时,Python 运行大约 1.3 秒,而 Raku 在我的笔记本电脑上运行大约 6.4 秒。任何人都有任何提高其性能的良好做法?
sub A(\i, \j) {
1e0 / ((i+j)*(i+j+1e0)/2e0 + i + 1e0)
}
sub Av(@v, \i) {
[+] ( -> \j { A(i, j) * @v[j] } for ^@v.elems );
}
sub Atv(@v, \i) {
[+] ( -> \j { A(j, i) * @v[j] } for ^@v.elems );
}
my $*SCHEDULER = ThreadPoolScheduler.new(:max_threads(4));
sub AtAv (@v) {
my @u-promise = (^@v.elems).map(-> \i { …Run Code Online (Sandbox Code Playgroud)