加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl6 – “我的$foo”有什么范围,它用于什么?

发布时间:2020-12-16 06:28:18 所属栏目:大数据 来源:网络整理
导读:使用正则表达式,标记或规则,可以像这样定义变量; token directive { :my $foo = "in command"; command subject value?} 语言文档here中没有任何内容,S05 – Regexes and Rules中的内容很少,引用; 任何语法正则表达式实际上只是一种方法,你可以使用冒号后跟
使用正则表达式,标记或规则,可以像这样定义变量;

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

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

解决方法

范围是什么:我的$foo;有?

:我的$foo ……;拥有它出现的规则/令牌/正则表达式的lexical scope.

(而且:我的$* 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
}

所以 : … ;语法用于获得完全所需的范围 – 既不太宽也不太窄.

典型用例

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

有关精确词汇范围的合适示例,请参阅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 module和its use in Rakudo’s Actions module.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读