Perl 6文档中的标识符由字母字符后跟任何字母数字字符序列组成。字母和数字的定义包括适当的Unicode字符。下划线始终被视为字母。如果下一个字符是字母,则标识符也可能包含孤立的撇号或连字符。
Syntax说:
标识符是在几个地方出现的语法构建块。标识符是原始名称,必须以字母字符(或下划线)开头,后跟零个或多个单词字符(字母,下划线或数字)。你也可以在中间嵌入破折号或单引号,但不能连续两行。
术语“适当的Unicode字符”引出了我们知道适当的问题。
如果我要选择超出ASCII字符,我发现这太模糊了。我在Perl6 :: Grammar中找到了这个产品,但没有找到>>> f(1)
/usr/local/bin/ipython3:8: RuntimeWarning: divide by zero encountered in double_scalars
Out[1]: inf
>>> g(1)
/usr/local/bin/ipython3:12: RuntimeWarning: divide by zero encountered in double_scalars
Out[2]: inf
>>> g(-3)
Out[3]: -0.35355339059327379j
的定义:
<.ident>
但这也引出了一个问题,即你必须知道标识符是什么来定义标识符。那么,token identifier {
<.ident> [ <.apostrophe> <.ident> ]*
}
在哪里?
raiph指出<.ident>
是<.ident>
中的ident
方法,但是用QRegex::Cursor
来定义它。现在我必须追踪它。
我试图使用U + 00B2(SUPERSCRIPT TWO)(一般类别No,Other_Number),因为我想传递一个昂贵的方形操作的结果,嘿,Perl 6应该允许这样:
nqp::const::CCLASS_WORD
但事实证明,²与其他上标一起是运营商。那没关系,但²之类的不是listed as an operator或my $a² = $a**2;
或行为Int
继承的:
Int
但我不能使用½U+ 00BD(VULGAR FRACTION ONE HALF)(No和Other_Number的一般类别):
$ 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
但是,如果我没有在$ 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
中添加数字怎么办?
$Δ
在-e第1行的块中
$ 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:
那么,那里发生了什么?
答案 0 :(得分:8)
语法有一个标识defined as
token apostrophe {
<[ ' \- ]>
}
token identifier {
<.ident> [ <.apostrophe> <.ident> ]*
}
ident
一个method on cursors,接受以CCLASS_ALPHABETIC
字符或下划线_
开头的输入,并继续使用零个或多个CCLASS_WORD
字符。< / p>
这些类为implemented in MoarVM并映射到各种Unicode类别。
具体来说,CCLASS_ALPHABETIC
检查 Letter,Lowercase ; Letter,大写; Letter,Titlecase ; Letter,Modifier 和 Letter,Other 。
CCLASS_WORD
还接受 Number,Decimal Digit 类别的字符以及下划线。
至于为什么后缀运算符不会破坏标识符,这是由于最长的令牌匹配。
如果要在变量Δ
上调用后缀运算符$Δ
,则必须添加反斜杠,即
multi sub postfix:<Δ>(Int $n) { 137 };
my $Δ = 6;
say $Δ\Δ;
或'unspace'
say $Δ\ Δ;