我正在尝试为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是做出这种事情的正确方法吗?还是别的什么完全不同?
谢谢您以前的所有帮助!
我之前的问题在这里:
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) say "1 10".split(" ")
Run Code Online (Sandbox Code Playgroud)
退货 (1,10)
当我使用这些1和10作为序列运算符的参数时[...]
say [...] "1 10".split(" ")
Run Code Online (Sandbox Code Playgroud)
返回,(1)而应该返回,(1 2 3 4 5 6 7 8 9 10)我想是因为split函数的输出被解释为字符串。
如何解决这个问题?谢谢。
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) 对于我正在编写的库,我在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) 我试图在一个数字中找到一组重复的数字,例如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 文档中指出,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) 我已经尝试在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 实现。它严格遵循此处的 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) 类名在 之后的范围内可用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)
那么符号仅表示例程名称而不是类名称吗?或者这是一个错误?