剧情简介2说:
一个标识符是由一个字母字符,随后的字母数字字符的任何序列的.字母和数字的定义包括适当的Unicode字符.下划线始终被视为字母.如果下一个字符是字母,则标识符还可以包含孤立的撇号或连字符.
Perl 6文档中的语法说:
标识符是在几个地方出现的语法构建块.标识符是原始名称,必须以字母字符(或下划线)开头,后跟零个或多个单词字符(字母,下划线或数字).你也可以在中间嵌入破折号或单引号,但不能连续两行.
术语"适当的Unicode字符"引出了一个问题,即我们知道什么是合适的.
如果我要选择超出ASCII字符,我发现这太模糊了.我在Perl6 :: Grammar中找到了这个产品,但没有找到<.ident>
:
token identifier {
<.ident> [ <.apostrophe> <.ident> ]*
}
Run Code Online (Sandbox Code Playgroud)
但这也引出了一个问题,你必须知道标识符是什么来定义标识符.那么,在哪里<.ident>
?
raiph指出这<.ident>
是ident
方法QRegex::Cursor
,但是用它来定义它nqp::const::CCLASS_WORD
.现在我必须追踪到这一点.
我试图使用U + 00B2(SUPERSCRIPT TWO)(一般类别No,Other_Number),因为我想传递一个昂贵的平方操作的结果,嘿,Perl 6应该允许这样:
my $a² = $a**2;
Run Code Online (Sandbox Code Playgroud)
但事实证明,²与其他上标一起是运营商.这没关系,但是²之类没有被列为运算符或者Int
行为Int
继承:
$ perl6 -e 'my $?² = 6; say $*PERL; say $?²'
Use of uninitialized value of type Any in numeric context in block <unit> at -e line 1
Cannot modify an immutable Int
in block <unit> 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
Run Code Online (Sandbox Code Playgroud)
但我不能使用½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
Run Code Online (Sandbox Code Playgroud)
但是,如果我不输入数字$?
怎么办?
$ 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 ?)
Run Code Online (Sandbox Code Playgroud)
在-e第1行的块中
Actually thrown at:
Run Code Online (Sandbox Code Playgroud)
在-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 ?$??;
Run Code Online (Sandbox Code Playgroud)
那么,那里发生了什么?
该语法具有定义为的标识符
token apostrophe {
<[ ' \- ]>
}
token identifier {
<.ident> [ <.apostrophe> <.ident> ]*
}
Run Code Online (Sandbox Code Playgroud)
使用游标上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 $?\?;
Run Code Online (Sandbox Code Playgroud)
或者是"空间"
say $?\ ?;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
358 次 |
最近记录: |