Perl5和Perl6对比使用Sigils的差别

2019-10-01 10:03:50丽君

# Perl 6
my @a := YourClass.new( 1,2,3 );

你可以写:

# Perl 6
my @a is YourClass = 1,2,3;

在Perl 5中,绑定数组比“普通”数组慢得多。在Perl 6中,数组在启动时同样缓慢。幸运的是,rakudo perl 6通过内联和“在定时”(Jiting)优化热代码路径。操作码在可能的情况下使用机器代码。(由于优化器的进步,这种情况发生得更快、更频繁、更好)。

%(Hash vs. Associative)

Perl 6中的散列实现类似于数组;您还可以将它们视为绑定散列(使用Perl 5术语)。而不是位置用于实现数组的角色,则结合性角色应用于实现散列。

同样,一个简单的例子可能会有所帮助。关键方法是实现结合性角色。每当需要访问特定键的值时,都会调用此方法。所以,当你写:

say %h<foo>

你正在执行:

say %h.AT-KEY("foo")

当然,有许多其他方法 你可以实现。

&(Subroutine vs. Callable)

在Perl 5中,只有一种可调用的可执行代码,即子程序:

# Perl 5
sub frobnicate { shift ** 2 }

而且,如果要将子例程作为参数传递,则需要获得对它的引用:

# Perl 5
sub do_stuff_with {
 my $lambda = shift;
 &$lambda(shift);
}
say do_stuff_with( &frobnicate, 42 ); # 1764

在Perl 6中,多种类型的对象可以包含可执行代码。他们的共同点是他们消耗了可赎回角色.

Sgil强制绑定到执行可赎回角色,就像%信号与结合性角色和@信号与位置角色。一个与Perl 5非常接近的例子是:

# Perl 6
my &foo = sub ($a,$b) { $a + $b }
say foo(42,666); # 708

注意,即使变量具有&Sigil,你知道不需要使用它来执行该变量中的代码。实际上,如果您在开始与普通的人相比,没有什么区别分声明:

# Perl 6
BEGIN my &foo = sub ($a,$b) { $a + $b } # same as sub foo()

与Perl 5不同的是,在Perl 6中,开始块可以是没有块的单个语句,因此它与外部共享其词法范围。但我们将在以后的文章中更多地讨论这个问题。

使用&变量是在编译时知道某物可执行文件,即使某物还不知道。

还有其他方法可以设置一段代码以供执行:

# Perl 6
my &boo = -> $a, $b { $a + $b } # same, using a Block with a signature
my &goo = { $^a + $^b }   # same, using auto-generated signature
my &woo = * + *;     # same, using Whatever currying

还可以使用&在签名内签名以表示被调用者希望在那里执行什么东西。这使我们回到本节中的前两个代码示例:

# Perl 5
sub frobnicate { shift ** 2 }
sub do_stuff_with {
 my $lambda = shift;
 &$lambda(shift);
}
say do_stuff_with( &frobnicate, 42 ); # 1764