小编Eli*_*sen的帖子

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

我正在尝试为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
查看次数

perl6“ P6opaque,Str”与简单的“ Str”类型-后续

谢谢您以前的所有帮助!

我之前的问题在这里:

perl6“ P6opaque,Str”与简单的“ Str”类型

我终于可以在这里重现错误:

my @recentList = prompt("Get recentList: e.g. 1 2 3: ").words || (2,4,6);    
say "the list is: ", @recentList;    
for @recentList -> $x {
    say "one element is:  ", $x;
    say "element type is: ", $x.WHAT;
    say "test (1,2,3).tail(\"2\") : ", (1,2,3).tail("2");
    say ( (10.rand.Int xx 10) xx 15 ).map: { @($_.tail($x)); };
}
Run Code Online (Sandbox Code Playgroud)

只要我使用默认列表,只需在提示符下按回车键而不输入任何内容,结果就可以了。但是,如果输入数字,则会出现此错误:

Get recentList: e.g. 1 2 3: 2
the list is: [2]
one element is:  2
element type is: (Str)
test …
Run Code Online (Sandbox Code Playgroud)

string int tail perl6 raku

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

Perl 6将split函数的输出解释为整数列表/数组

say "1 10".split(" ") 
Run Code Online (Sandbox Code Playgroud)

退货 (1,10)

当我使用这些110作为序列运算符的参数时[...]

say [...] "1 10".split(" ")
Run Code Online (Sandbox Code Playgroud)

返回,(1)而应该返回,(1 2 3 4 5 6 7 8 9 10)我想是因为split函数的输出被解释为字符串。

如何解决这个问题?谢谢。

perl6 raku

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

Problem with Raku and SSL on Windows Machine

I just installed perl6 on windows server and windows 7.

I want to port a script which is already running on openbsd to a windows machine.

I tested this code:

my $resp = await Cro::HTTP::Client.get('https://www.perl6.org/');
Run Code Online (Sandbox Code Playgroud)

And I'll get is this on both Windows machines:

C:\Users\Matthias\CommaProjects\testing>perl6 cro.pl6
Tried to get the result of a broken Promise
  in block  at C:\rakudo\share\perl6\site\sources\0609EA0BB03C70C2C15DB4B144D704
1C1059D14C (Cro::TLS) line 108

Original exception:
    An operation first awaited:
      in block  at C:\rakudo\share\perl6\site\sources\A4ECA701FE96A8456AEB83692D
6B3C55AAFC964C (IO::Socket::Async::SSL) line 322

    Died with the …
Run Code Online (Sandbox Code Playgroud)

openssl ssl-certificate cro raku

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

如何动态生成用于特征的值?

对于我正在编写的库,我在HOW上有一个属性,该属性使用handles特征将由另一HOW所完成的各种角色的方法委派给该HOW的实例。我的第一次尝试是这样的(尽管为了使它更易于阅读,这只会处理Metamodel::Naming):

class ParentHOW does Metamodel::Naming {
    method new_type(ParentHOW:_: Str:D :$name!, Str:D :$repr = 'P6opaque' --> Mu) {
        my ::?CLASS:D $meta := self.new;
        my Mu         $type := Metamodel::Primitives.create_type: $meta, $repr;
        $meta.set_name: $type, $name;
        $type
    }
}

class ChildHOW {
    has Mu $!parent;
    has Mu $!parent_meta handles <set_name shortname set_shortname>;

    submethod BUILD(ChildHOW:D: Mu :$parent is raw) {
        $!parent      := $parent;
        $!parent_meta := $parent.HOW;
    }

    method new_type(ChildHOW:_: Mu :$parent is raw) {
        my ::?CLASS:D $meta := self.new: :$parent;
        Metamodel::Primitives.create_type: …
Run Code Online (Sandbox Code Playgroud)

oop traits raku

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

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

在 Raku 文档中指出,gather-take 构造正在被惰性评估。在下面的例子中,我很难对结构的懒惰得出结论:

say 'Iterate to Infinity is : ', (1 ... Inf).WHAT;

say 'gather is : ', gather {
    take 0;
    my ($last, $this) = 0, 1;

    loop {
        take $this;
        ($last, $this) = $this, $last + $this;
    }
}.WHAT;

say '------------------------------------';

my @f1 = lazy gather {
    take 0;
    my ($last, $this) = 0, 1;

    loop {
        take $this;
        ($last, $this) = $this, $last + $this;
    }
}

say '@f1         : ', @f1.WHAT;
say '@f1 is lazy …
Run Code Online (Sandbox Code Playgroud)

arrays lazy-evaluation rakudo lazy-sequences raku

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

递归函数和类中的 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 实现。它严格遵循此处的 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
查看次数

由于 EVALFILE 引入类符号

类名在 之后的范围内可用EVALFILE,而文档可能另有说明。

EVALFILE 状态的文档:

Slurps 指定的文件并对其进行评估。在Blob 解码、范围、$lang 参数和 $check 参数方面的行为与EVAL相同。当 $check 不为​​ True 时,计算文件中最后一条语句产生的值。

EVAL 状态的文档:

由于词法作用域中的符号集在编译后是不可变的,因此EVAL 永远不能将符号引入周围的作用域。

我的输入文件是:

class SomeClass {
    method a () { "In SomeClass method a"; };
}

sub some-routine () {
    "Some routine";
}
Run Code Online (Sandbox Code Playgroud)
> my $f = EVALFILE("/tmp/eval-bug.raku");
&some-routine

> $f()
Some routine

> some-routine()
===SORRY!=== Error while compiling:
Undeclared routine:
    some-routine used at line 1
Run Code Online (Sandbox Code Playgroud)

以上三个执行符合文档,但以下不符合:

> SomeClass.a()
In SomeClass method a
Run Code Online (Sandbox Code Playgroud)

那么符号仅表示例程名称而不是类名称吗?或者这是一个错误?

eval rakudo raku

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