gpt4 book ai didi

raku - 语法行为是否在6.c和6.d之间中断?

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

我的语法在6.c(2018.01)中可以正常工作-我无法在6.d(2019.03.01)中获得稳定的输出。

当我打开Grammar::Tracer(nice!)时,模式似乎是一致的。

但是在输入相同的“m/s”的情况下,我的输出会在一系列结果中随机徘徊,例如...
* m/s = m。真实
* m/s = True.m
* m/s = s-1。
* m/s = m.s-1(这是我想要的那个,不在乎顺序)

我对match对象的unam =>「s」/「m「内容感到怀疑(请参阅调试代码)-Tracer在每个分支中仅显示unam的一个匹配项。

欢迎所有建议!

#!/usr/bin/env perl6

sub get-dime( $dime-str ) {
use Grammar::Tracer;

my $unit-names = '|m|s';

grammar UnitGrammar {
token TOP { <dim> <divi> <den> }
token divi { \/ }
token dim { <unam> }
token den { <unam> }
token unam { <$unit-names> }
}
class UnitActions {
method TOP($/) { make $/.values.[0].made~'.'~$/.values.[1].made }
method dim($/) { make ~$<unam> }
method den($/) { make ~$<unam>~'-1' }
method divi($/) { make True }
}

my $match = UnitGrammar.parse($dime-str, :actions(UnitActions));

#[[ verbose for debug (also uncomment #use Grammar::Tracer)
say "$match=", $match.made;
say "--------------------";
say $match.values;
say $match.values.[0].made;
say $match.values.[1].made;
#]]

return $match.made if $match.so;
}
say $*PERL.compiler.version;
say get-dime( 'm/s' );

禁止
enter image description here

最佳答案

@Håkon为游戏命名。您整装待发着陆在跑道上。我让我们靠近果岭,但处于崎rough不平。 @ugexe捕获了球。 @Håkon跳过了这个洞,移至下一个发球区域并打入一个洞。所以我想我要写赛后总结了。

不是6.c6.d

潜在的问题是,哈希被指定为以随机顺序列出其键/值对。在较早的编译器中,哈希列表实现以固定顺序返回键/值对。然后samcv implemented hash randomization for MoarVM last year。它破坏了错误地依赖哈希顺序的代码。

因此,以下代码-自2018.05开始在Rakudo/MoarVM上-随机显示(a b)(b a):

say .values given { apple => 'a', bananas => 'b' }

您的代码正在对 .values对象调用 Match

调用该方法通常可以归结为类似于以下内容:
say .values given ( apple => 'a', bananas => 'b', 0, 1, 2 ) .Capture

它将显示一个列表,列表以 0 1 2开头(它们是位置信息,因此它们以正确的顺序首先显示),然后显示 a bb a(它们的名字以使其以随机顺序最后显示)。

这又是因为 Match Capture 的子类,并且从该类继承其 .values方法。正如 its doc所说:

Returns a Seq containing all positional values followed by all named argument values.



您的代码中没有位置捕获。因此,您所看到的只是命名捕获的值。但是它们当然在列表中,因此出现在 .[0].[1]等索引下,这可能会诱使您认为它们是有序的(结合以下事实:在早期的Rakudos中,它们的随机顺序实际上是固定的) 。
.caps对此进行了改进,因为它根据其值在输入中的匹配位置对其值进行排序。这将确保命名捕获的值列表的稳定排序-前提是所有捕获都不共享匹配的位置:
say .caps given 'foo' ~~ / $<alias>=<ident> /

将随机显示 (alias => 「foo」 ident => 「foo」)(ident => 「foo」 alias => 「foo」)

我的第一个答案

作为记录,这是此答案的第一个版本:

在这里,我想去的尽可能远的地方是高尔夫:
grammar {
token TOP { <one> <two> }
token one { 1 }
token two { 2 }
}.parse('12').values.say;

在v2018.04中,这是在tio.run上运行的当前版本,它可靠地显示 (「1」 「2」)。在glot.io上运行的当前版本v2018.12中,这会生成 (「1」 「2」)(「2」 「1」),两者之间会随机变化。

我不知道这是否是错误。调查仍在继续,但我认为我会将其发布为初步答案。

关于raku - 语法行为是否在6.c和6.d之间中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56206201/

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