Perl 6标识符允许什么?

时间:2016-01-09 04:59:29

标签: unicode perl6

Synopsis 2说:

  

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

Perl 6文档中的

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 operatormy $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:

那么,那里发生了什么?

1 个答案:

答案 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 $Δ\   Δ;