小编Eli*_*sen的帖子

如何将LEAVE相位器导出到use语句的外部范围

我想创建一个Perl 6模块,它将一个LEAVE移相器"导出" 到use放置语句的作用域.我还没有办法做到这一点.

我认为这需要在EXPORT子内部完成,但如何?EXPORTsub 的默认功能是返回一个Map名称=>要导出的事物的对象映射.据我所知,没有办法反省外部范围.或者我错过了什么?

perl6

8
推荐指数
1
解决办法
144
查看次数

一个 CATCH 块捕获多少个异常?

如果一个 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{} 中?

exception raku

8
推荐指数
1
解决办法
120
查看次数

重写方法调用操作符或其他一些方法来捕获方法名称解析错误

我正在尝试为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是做出这种事情的正确方法吗?还是别的什么完全不同?

oop perl6 dispatch

7
推荐指数
1
解决办法
82
查看次数

捕捉并抛出自定义异常

“ 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)

没错

perl6 raku

7
推荐指数
1
解决办法
121
查看次数

为什么在StackOverflow上不再询问Perl 6问题?

它似乎在2019年10月的某个地方停止了。我认为Perl 6的开发仍在继续。那么,为什么没有更多人问有关Perl 6的问题了?

perl6

7
推荐指数
0
解决办法
252
查看次数

在 Raku 中查找重复数字的优雅方法(née 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)

但不是很优雅。

有一个更好的方法吗?

regex raku

7
推荐指数
2
解决办法
143
查看次数

供应方法行为与水龙头之间的区别

在 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)

tap act rakudo publish-subscribe raku

7
推荐指数
1
解决办法
86
查看次数

递归函数和类中的 Raku 类型约束

我已经尝试在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)

recursion types constraints class raku

7
推荐指数
1
解决办法
83
查看次数

raku:最长的比赛不做最长的比赛,但在第一场比赛后退出

我正在使用 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)

regex match raku

7
推荐指数
1
解决办法
88
查看次数

在基准游戏中提高谱范数性能的任何技巧

我正在尝试实现光谱范数基准游戏,下面是我的 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)

rakudo raku

7
推荐指数
0
解决办法
103
查看次数