Use of implicit parameter in for-loop causes hang

Jo *_*als 6 perl6 raku

Consider the following code

my $a = "AABBCCBGG";
say join "\n", do for $a.comb.squish {
  $a ~~ s/^ ($_+) //;
}
Run Code Online (Sandbox Code Playgroud)

versus

my $a = "AABBCCBGG";
say join "\n", do for $a.comb.squish -> $b {
  $a ~~ s/^ ($b+) //;
}
Run Code Online (Sandbox Code Playgroud)

The first hangs forever while the last executes as expected. Is this an error or is there some finer detail while using the implicit $_ that I don't understand? Using Rakudo Star 2019.03.01.

rai*_*iph 9

您使用$_的代码在道德上等同于:

/''+/
Run Code Online (Sandbox Code Playgroud)

它将永远循环(因为空字符串''匹配无限次)。

(好吧,我只显示了一个简单的匹配,并且$_必须将其分配或绑定到强制转换为字符串的某个值,否则将不会发生无限循环,并且您的代码必须绕过其循环两次才能变成一个道德上与上述相同,但这些都是鲱鱼。)

在使用$_我不理解的隐式函数时,有一些更好的细节吗?

smartmatch文档中

smartmatch运算符将左侧别名为 $_

在代码中:

lhs ~~ rhs;
Run Code Online (Sandbox Code Playgroud)

等效于:

$_ := lhs;
rhs.ACCEPTS(lhs);
Run Code Online (Sandbox Code Playgroud)

我怀疑您没有考虑上述两行中的第一行。

(只需使用第二行自身,如果你想避免这个话题化。1

假定$_分配了一个定义的非空字符串:

s/$_//;
Run Code Online (Sandbox Code Playgroud)

始终更新$_为空字符串('')。

和:

$a ~~ s/^ ($_+) //;
Run Code Online (Sandbox Code Playgroud)

将别名$_$a,然后同时更新$_,并$a为空字符串。

因此,第二次在for循环中~~再次使用别名$_$a,现在它包含一个空字符串,然后您便得出了我的答案所基于的无限循环条件。

脚注

1在下面的评论中,Jo询问了为什么 ~~ 需要 “主题化”(别名$_lhs)。权威的答案大概存储在@Larry的集体大脑中,可以说是P6设计文档最好地表达了这一点(在页面搜索“智能匹配”和“智能匹配”似乎是票证)。但是,我会就此事发表自己的想法。

首先,aiui,不需要这种方式。

Aiui @Larry可能刚刚决定,依赖于当前主题的构造(我认为这意味着//s///以及适当的例行调用)与P5一样。

这是在P5(具有适当的编译指示)和P6中运行的一些代码:

my $a = 'a value';
$_ = 'another value';
say $a ~~ s/value/changed string/;
say $a;
say $_;
Run Code Online (Sandbox Code Playgroud)

您期望结果如何?

在P5中:


a value
another changed string
Run Code Online (Sandbox Code Playgroud)

在P6中:

?value?
a changed string
another value
Run Code Online (Sandbox Code Playgroud)

P5保持$a不变,进行修改$_,然后将修改后的结果与原始结果进行比较,$a并得出结论,它们不匹配(因此该say $a ~~ ...行表示空白行)。

P6别名$_$a 了智能匹配的持续时间,叶$a永久%的修改s///,并恢复$_到以前的值之后。

如果我们坚持使用P5的方式,我们也将无法编写以下内容:

  • foo ~~ / ... /如果foo匹配正则表达式,则为真;

  • my $a = 'AA'; $a ~~ .uc不论$_ 此代码之前或之后的值如何,它都为真;

  • foo ~~ .&bar匹配bar子在哪里期待一个参数,我们希望它得到foo

在此期间,.ACCEPTS也可用。因此,这并不是说您不能做与P5相同的事情。只是,默认情况下,对主题起作用的构造可能是人们可能期望的,如果他们首先接触P5,并@Larry认为总体上是一件好事。

总而言之,Jo,我听说P5达到了您的期望,但是至少可以部分地认为是因为您已经使用了 P5,并且您的期望在很大程度上取决于它的作用,并且在考虑了它之后是否想保留它仍然是您喜欢的东西以上,并给自己足够的时间来吸收它。我很想听听您关于接下来一个月的感觉的后续评论!

至少,这是我目前对此主题的想法。