“我的$ foo”有什么范围以及它用于什么?

时间:2016-03-21 08:47:59

标签: perl6

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

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

语言文档here中没有任何内容,S05 - Regexes and Rules中的内容很少,引用;

任何语法正则表达式实际上只是一种方法,您可以使用冒号后跟任何由Perl 6语法解析的范围声明符来声明变量,包括my,my,state和constant 。 (作为准声明者,temp和let也被识别。)单个语句(通过终止分号或行结束右括号)被解析为普通的Perl 6代码:

token prove-nondeterministic-parsing {
    :my $threshold = rand;
    'maybe' \s+ <it($threshold)>
}

我认为语法中的regexen与类中的方法非常相似;我知道你可以在一个规则内的任何地方启动一个块,如果解析成功到达那个点,那么块将被执行 - 但我不明白这个东西到底是什么。

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

1 个答案:

答案 0 :(得分:7)

:my $foo;的范围是什么?

:my $foo ...;具有显示的规则/令牌/正则表达式的lexical scope

(并且:my $*foo ...; - 请注意表示动态变量的额外* - 包含其出现的规则/令牌/正则表达式的词法和dynamic scope。)< / p>

这用于

以下没有这个结构会发生什么:

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
}

因此: ... ;语法用于获得所需的范围 - 既不太宽也不太窄。

典型用例

此功能通常用于大型或复杂的语法中,以避免松散的范围(会产生错误)。

有关精确 lexical only scoping 的合适示例,请参阅token babble as defined in a current snapshot of Rakudo's Grammar.nqp source code@extra_tweaks的声明和使用。

P6支持action objects。这些类的方法与语法中的规则一一对应。只要规则匹配,它就会调用相应的操作方法。 Dynamic variables提供了正确的范围,用于声明作用于块的变量(方法,规则等),它们在词汇和动态中都被声明 - 后者意味着它们可用于相应的行动方法也是如此。有关此示例,请参阅the declaration of @*nibbles in Rakudo's Grammar moduleits use in Rakudo's Actions module