gpt4 book ai didi

raku - ":my $foo"有什么作用域,它有什么用途?

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

使用正则表达式、标记或规则,可以像这样定义变量;

token directive {
:my $foo = "in command";
<command> <subject> <value>?
}

语言文档 here 中没有关于它的任何内容,在 S05 - Regexes and Rules 中很少, 报价;

任何语法正则表达式实际上只是一种方法,您可以在这样的例程中使用冒号声明变量,后跟 Perl 6 语法解析的任何范围声明符,包括 my、our、state 和 constant。 (作为准声明符, temp 和 let 也被识别。)单个语句(通过终止分号或 line-final 右括号)被解析为正常的 Perl 6 代码:
token prove-nondeterministic-parsing {
:my $threshold = rand;
'maybe' \s+ <it($threshold)>
}

我发现语法中的正则表达式与类中的方法非常相似;我知道你可以在规则内的任何地方开始一个块,如果解析成功到达那个点,块将被执行 - 但我不明白这到底是做什么用的。

有人可以清楚地定义它的范围是什么吗?解释它满足什么需求并给出典型用例?

最佳答案

:my $foo;的范围是什么有?:my $foo ...;lexical scope它出现的规则/ token /正则表达式。
(还有 :my $*foo ...;——注意额外的 * 表示一个动态变量——同时具有它出现的规则/标记/正则表达式的词法和 dynamic scope。)
这是用来做什么的
这是没有这个结构会发生的事情:

regex scope-too-small {    # Opening `{` opens a regex lexical scope.
{ my $foo = / bar / } # Block with its own inner lexical scope.
$foo # ERROR: Variable '$foo' is not declared
}

grammar scope-too-large { # Opening `{` opens lexical scope for gramamr.
my $foo = / bar / ;
regex r1 { ... } # `$foo` is recognized inside `r1`...
...
regex r999 { ... } # ...but also inside r999
}
所以 : ... ;语法用于准确获得所需的范围——既不太宽也不太窄。
典型用例
此功能通常用于大型或复杂的语法,以避免松散的范围(这会滋生错误)。
有关仅精确词法范围的合适示例,请参阅 @extra_tweaks 的声明和使用。在 token babble as defined in a current snapshot of Rakudo's Grammar.nqp source code .
P6 支持 action objects .这些类的方法与语法中的规则一一对应。每当规则匹配时,它就会调用其相应的操作方法。 Dynamic variables为声明范围为块(方法、规则等)的变量提供准确的范围,它们在词法和动态中声明——后者意味着它们也可以在相应的操作方法中使用。有关此示例,请参阅 the declaration of @*nibbles in Rakudo's Grammar moduleits use in Rakudo's Actions module .

关于raku - ":my $foo"有什么作用域,它有什么用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36126393/

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