剧情简介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 blockat -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 ?$??;
那么,那里发生了什么?
该语法具有定义为的标识符
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 $?\ ?;