gpt4 book ai didi

loops - 为什么 Perl 6 的循环变量声明在外部作用域?

转载 作者:行者123 更新时间:2023-12-04 06:54:04 24 4
gpt4 key购买 nike

在 Perl 6 中,以 for 样式声明的变量 loop是在外部范围内。这有效和is documented .

loop ( my $n = 0; $n < 3; $n++ ) {
put $n;
}

say "Outside: $n";
$n在块外可见:
0
1
2
Outside: 3

这里是否有一个激励技巧使这与人们对 Perl 6 祖先的期望不同?我在设计文档中没有看到提到这一点(但有时尝试搜索“循环”)。我想不出一个能让事情变得更容易的例子。

在 Perl 5 中,同样的事情是一个严格的错误:
use v5.10;
use strict;

for ( my $n = 0; $n < 3; $n++ ) {
put $n;
}

say "Outside: $n"; # Nope!

而且,在 C 中(那些让你这样做的),这是一个类似的错误:
#include <stdio.h>

int main () {

for( int a = 10; a < 20; a = a + 1 ){
printf("value of a: %d\n", a);
}

printf("value of a: %d\n", a); /* Nope! */

return 0;
}

像往常一样,我对解决方法不感兴趣。我知道该怎么做。

正如我在评论中指出的, Synopsis 4插入实现只在它们将出现的块内声明词法。
$n出现在 { 之前所以它不是“内部”块。

但是,尖块呢?
-> $a { put "a is $a" }

还有,子程序签名?
sub ( $a ) { put "a is $a" }

这些变量首先在 { 之前键入.

我并不特别关心这一点,但如果我必须通过说必须在将使用它们的块中声明词法变量来解释这种打破传统的做法,有人可以指出这些情况。

最佳答案

您可以将其视为创建词法作用域的块。

if (1) {
my $a = 1;
}
$a; # error

if (my $a = 1) {
}
$a; # no error

loop (my $a = 1; $a == 1; ++$a) {
}
$a; # no error

只是其他类 C 语言的特殊情况(C 风格) for循环,而 Perl 6 的设计是尽可能减少特殊情况。

因此,如果某物在某个地方非常有用,则应将其设计为在任何地方都可用。

例如 -1在数组中索引。
而不仅仅是拥有 @a[*-1]作为受限于数组索引的特殊语法, *-1只是一种创建 lambda/闭包的方法,您可以在任何需要简单 lambda 的地方使用它。

另一个例子是尖块不仅仅是在 for 中声明迭代变量的一种方式。环形。

for @a -> $value {…}

它们可用于任何类似的构造。

if $a.some-resource-expensive-op -> $result {…}

代替

{
# note that $result isn't read-only like it is above
my $result = $a.some-resource-expensive-op;
if $result {…}
}

您甚至可以将其用作另一种语法来创建 lambda。

@a.sort: -> $value {…}

为了使语言更易于推理,特殊情况需要自己权衡,并且只有 loop 的参数。构造,没有其他构造,成为块的一部分只是没有。
如果它普遍有用,那么它会有所不同。

还有 loop构造是为数不多的不符合 Perl 6 的一般设计美学的特性之一。我认为争论它的弃用和删除可能比它更特殊的情况更容易。
(没有人主张将其删除)

关于loops - 为什么 Perl 6 的循环变量声明在外部作用域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45407755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com