曾经有一个图表跟踪Perl6对Perl6测试套件的实现.我有兴趣观察它的进展(并且,退步).该图表发生了什么,它曾经在www.rakudo.de网站上托管
有没有其他简单的方法,局外人可以了解Rakudo在完善规范方面的立场?还缺少什么功能?
我不能在Perl 6中的类中调用私有方法:
class MyClass {
method !my-private-method($var1) {
# ....
}
method my-method() {
my $my-var1 = !my-private-method(123); # not found (Undeclared routines)
my $my-var1 = $!my-private-method(123); # not found (Undeclared routines)
my $my-var1 = $.my-private-method(123); # not found (Undeclared routines)
my $my-var1 = my-private-method(123); # not found (Undeclared routines)
Run Code Online (Sandbox Code Playgroud)
那我怎么打电话my-private-method来my-method?
考虑以下Python代码(作为示例):
a = 5
b = "a"
l = [a, b] # -> typing.List[typing.Any]
print(l)
# [5, "a"]
Run Code Online (Sandbox Code Playgroud)
列表的类型l是list; 它不受它所拥有的类型的约束,因为Python是非常动态的类型.
将此与Go相比较,Go是强结构类型的:
var list []uint8{1, 2, 3, 4, 5, 6}
Run Code Online (Sandbox Code Playgroud)
该列表只能保存最多255个无符号整数.它不能保存任何其他类型.
也去:
var multi interface{"string", []int{9, 5}, rune('5'), []interface{}}
Run Code Online (Sandbox Code Playgroud)
接口允许不同类型的容器.
考虑Perl 6的,这更加动态地在类型比Python say 6 + "1";会给7的整数.(谁认为这是一个我不知道的好主意.)
我喜欢逐渐输入我的程序(特别是对于我正在学习的Perl 6),它提高了可读性和可维护性.
以下工作都不是:
use strict;
my Int $n = 6;
my Str $x = "a";
my Int @l = $n, $x;
Run Code Online (Sandbox Code Playgroud)
也不
use strict;
my Int $n = …Run Code Online (Sandbox Code Playgroud) Perl 5使用-T开关支持污染模式.该脚本将在内部将从脚本外部源检索到的任何值标记为受污染的值,该值应该不受污染.Perl 6是否支持这样的选择?
我正在尝试编写在promises中运行的3个echo服务器,但我想知道哪个承诺正在进行回显.有没有办法做到这一点?
no strict;
for 0 .. 2 -> $index {
@result[$index] = start {
$myID = $index;
say "======> $myID\n";
my $rsSocket = IO::Socket::INET.new:
localhost => 'localhost',
localport => 1234 + $index,
listen => 1;
while $rsSocket.accept -> $rsConnection {
say "Promise $myID accepted connection";
while $rsConnection.recv -> $stuff {
say "promise $myID Echoing $stuff";
$rsConnection.print($stuff);
}
$rsConnection.close;
}
}
}
await @result;
Run Code Online (Sandbox Code Playgroud)
echo服务器运行正常; 用"nc"测试;
在创建承诺之后,问题$myID就2出现了,并且我无法告诉哪个承诺正在进行当前的回显.它似乎$myID被所有的承诺所使用; 有没有办法创建特定于个人承诺的变量?
我有这段代码.第一个非嵌套map输出一些东西,嵌套一个没有.我想我理解为什么第二个不起作用.这是一个懒惰的序列,Perl 6正在收集结果.没关系.但是不是第一个(非嵌套)map以同样的方式懒惰吗?如果我不对地图的结果做任何事情,它如何输出任何内容?也就是说,第一个人怎么懒?是否会自动获取接收器上下文,我必须明确sink地为嵌套的上下文提供(或某些东西)?不知怎的,我认为Perl 6应该能够为我解决这个问题.
my @array = (1, 2), (3, 4), ('a', 'b');
say "---On its own:";
my @item = 1, 2, 3;
@item.map: {
say $_;
};
say "---Inside another map:";
@array.map: {
my @item = 1, 2, 3;
@item.map: {
say $_;
}
};
Run Code Online (Sandbox Code Playgroud)
这是输出:
---On its own:
1
2
3
---Inside another map:
Run Code Online (Sandbox Code Playgroud)
这与问题如何在Perl 6中的"for"循环中使用"map"这个问题有关?.那个人说要做什么,但我问的更多是为什么问题.
在这方面,该解决方案是添加eager,sink或分配给内部map:
say "---eager:";
@array.map: { …Run Code Online (Sandbox Code Playgroud) 在perl6中我可以创建一个固定大小的数组,如下所示:my @array [5];
然后我怎样才能将数组的大小更改为更大,例如我希望数组现在大小为7
谢谢
我现在开始在一些Perl6上弄脏手.具体来说,我正在尝试编写基于语法的Fortran解析器(Fortran :: Grammar模块)
出于测试目的,我希望有可能将Match对象转换为JSON可序列化Hash.
谷歌搜索/ 官方Perl6文档没有帮助.如果我忽视某些事情,我道歉.
到目前为止我的尝试:
Match $m为Hashvia $m.hash.但这会保留嵌套Match对象.Match对象的内容显然最好通过make/ 来完成made.我希望有一个超级简单的Actions对象,用于所有匹配.parse的默认方法,基本上只是做一个make $/.hash或类似的东西.我根本不知道如何指定默认方法.我正在尝试Hash使用非字符串键,在我的情况下使用数组或列表.
> my %sum := :{(1, 3, 5) => 9, (2, 4, 6) => 12}
{(1 3 5) => 9, (2 4 6) => 12}
Run Code Online (Sandbox Code Playgroud)
现在,我不明白以下几点.
如何检索现有元素?
> %sum{(1, 3, 5)}
((Any) (Any) (Any))
> %sum{1, 3, 5}
((Any) (Any) (Any))
Run Code Online (Sandbox Code Playgroud)
如何添加新元素?
> %sum{2, 4} = 6
(6 (Any))
Run Code Online (Sandbox Code Playgroud) 用一个代码片段
perl6 -e 'loop { FIRST say "foo"; last }'
Run Code Online (Sandbox Code Playgroud)
我明白了
WARNINGS for -e:
Useless use of LOOP_BLOCK_1 symbol in sink context (line 1)
foo
Run Code Online (Sandbox Code Playgroud)
我知道如何解决警告.我想知道警告的来源是什么.我发现这张门票,但似乎没有得到任何关注.
这个警告是关于什么的?
那怎么回事呢?
$ perl6 --version
This is Rakudo version 2018.06 built on MoarVM version 2018.06
implementing Perl 6.c.
Run Code Online (Sandbox Code Playgroud)