Raku “范围”是什么“我的$foo”;它有什么用途?

Raku “范围”是什么“我的$foo”;它有什么用途?,raku,Raku,使用正则表达式、令牌或规则,可以这样定义变量 token directive { :my $foo = "in command"; <command> <subject> <value>? } 令牌指令{ :my$foo=“in command”; ? } 语言文档中没有关于它的内容,引述的内容也很少 任何语法正则表达式实际上只是一种方法,您可以在这样的例程中使用冒号声明变量,冒号后跟Perl 6语法解析的任何范围声明符,包括my、our、

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

token directive {
    :my $foo = "in command";
    <command> <subject> <value>?
}
令牌指令{
:my$foo=“in command”;
?
}
语言文档中没有关于它的内容,引述的内容也很少

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

令牌证明非确定性解析{
:my$threshold=rand;
“可能”\s+
}
我发现语法中的正则表达式与类中的方法非常相似;我知道你可以在一个规则中的任何地方启动一个块,如果解析成功,这个块就会被执行——但我不明白这到底是为了什么

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

的作用域是什么:我的$foo有吗?
:我的$foo
具有其出现的规则/令牌/正则表达式的名称

(和
:my$*foo…;
——请注意,表示动态变量的额外
*
——具有其出现的规则/token/regex的词法和语法。)

这是用来干什么的 以下是没有此构造时会发生的情况:

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
}
因此,
语法用于精确地获得所需的范围——既不太宽也不太窄

典型用例 此功能通常用于大型或复杂的语法中,以避免范围过宽(这会滋生bug)

有关精确的词汇范围界定的适当示例,请参见中的
@extra_tweaks
的声明和使用

P6支持。这些类的方法与语法中的规则一一对应。只要规则匹配,它就会调用相应的操作方法。为声明作用域为块(方法、规则等)的变量提供准确的作用域。它们在词汇和动态中都被声明——后者意味着它们在相应的操作方法中也可用。有关此示例,请参见和

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
}