当前位置:  开发笔记 > 编程语言 > 正文

Perl 6标识符允许什么?

如何解决《Perl6标识符允许什么?》经验,为你挑选了1个好方法。

剧情简介2说:

一个标识符是由一个字母字符,随后的字母数字字符的任何序列的.字母和数字的定义包括适当的Unicode字符.下划线始终被视为字母.如果下一个字符是字母,则标识符还可以包含孤立的撇号或连字符.

Perl 6文档中的语法说:

标识符是在几个地方出现的语法构建块.标识符是原始名称,必须以字母字符(或下划线)开头,后跟零个或多个单词字符(字母,下划线或数字).你也可以在中间嵌入破折号或单引号,但不能连续两行.

术语"适当的Unicode字符"引出了一个问题,即我们知道什么是合适的.

如果我要选择超出ASCII字符,我发现这太模糊了.我在Perl6 :: Grammar中找到了这个产品,但没有找到<.ident>:

token identifier {
    <.ident> [ <.apostrophe> <.ident> ]*
}

但这也引出了一个问题,你必须知道标识符是什么来定义标识符.那么,在哪里<.ident>

raiph指出这<.ident>ident方法QRegex::Cursor,但是用它来定义它nqp::const::CCLASS_WORD.现在我必须追踪到这一点.


我试图使用U + 00B2(SUPERSCRIPT TWO)(一般类别No,Other_Number),因为我想传递一个昂贵的平方操作的结果,嘿,Perl 6应该允许这样:

my $a² = $a**2;

但事实证明,²与其他上标一起是运营商.这没关系,但是²之类没有被列为运算符或者Int行为Int继承:

$ perl6 -e 'my $?² = 6; say $*PERL; say $?²'
Use of uninitialized value of type Any in numeric context  in block  at -e line 1
Cannot modify an immutable Int
  in block  at -e line 1

$ perl6 -e 'my $? = 6; say $*PERL; say $?²'
Perl 6 (6.c)
36

$ perl6 -e 'my $? = 6; say $*PERL; say $?³'
Perl 6 (6.c)
216

$ perl6 -e 'my $? = 6; say $*PERL; say $??'
Perl 6 (6.c)
10077696

但我不能使用½U+ 00BD(VULGAR FRACTION ONE HALF)(No和Other_Number的常规类别):

$ perl6 -e 'my $?½ = 6; say $*PERL; say $?½'
===SORRY!=== Error while compiling -e
Bogus postfix
at -e:1
------> my $??½ = 6; say $*PERL; say $?½
    expecting any of:
        constraint
        infix
        infix stopper
        postfix
        statement end
        statement modifier
        statement modifier loop

但是,如果我不输入数字$?怎么办?

$ perl6 -e 'my $? = "foo"; say $*PERL; say $?²'
Cannot convert string to number: base-10 number must begin with valid digits or '.' in '?foo' (indicated by ?)

在-e第1行的块中

Actually thrown at:

在-e第1行的块中

我担心定义后缀运算符的人可能会破坏语言,但这似乎有效:

$ perl6 -e 'multi sub postfix:(Int $n) { 137 }; say  6?;'
137

$ perl6 -e 'multi sub postfix:(Int $n) { 137 }; my $?? = 6; say $??;'
6

$ perl6 -e 'multi sub postfix:(Int $n) { 137 }; my $? = 6; say $??;'===SORRY!=== Error while compiling -e
Variable '$??' is not declared
at -e:1
------> fix:(Int $n) { 137 }; my $? = 6; say ?$??;

那么,那里发生了什么?



1> Christoph..:

该语法具有定义为的标识符

token apostrophe {
    <[ ' \- ]>
}

token identifier {
    <.ident> [ <.apostrophe> <.ident> ]*
}

使用游标上ident的方法接受以CCLASS_ALPHABETIC字符或下划线开头的输入,_并继续使用零个或多个CCLASS_WORD字符.

这些类在MoarVM中实现,并映射到各种Unicode类别.

具体来说,CCLASS_ALPHABETIC检查Letter,Lowercase ; 信,大写 ; 信,Titlecase ; 信,修饰语字母,其他.

CCLASS_WORD另外接受类别Number,Decimal Digit以及undercores的字符.

至于为什么后缀运算符不会破坏标识符,这是由于最长的令牌匹配.

如果要?在变量上调用postfix运算符$?,则必须添加反斜杠,即

multi sub postfix:(Int $n) { 137 };
my $? = 6;
say $?\?;

或者是"空间"

say $?\   ?;


反斜杠是一个空格,只是没有任何空格可以撤消.您还可以声明可以使用后缀运算符的完全限定名称`say postfix:<Δ> $Δ;`
推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有