2016-01-09 13 views
8

Synopsis 2言う:Perl 6の識別子には何が許可されていますか?

識別子は、英数字の任意のシーケンスが続くアルファベットで構成されています。アルファベットと数字の定義には、適切なUnicode文字が含まれています。アンダースコアは常にアルファベットとみなされます。次の文字がアルファベットである場合、識別子には分離されたアポストロフィまたはハイフンも含まれます。 Perl 6のドキュメントで

Syntax言う:

識別子は、いくつかの場所で発生する文法的ビルディングブロックです。識別子はプリミティブ名で、アルファベット文字(またはアンダースコア)、0個以上の単語文字(アルファベット、アンダースコア、または数字)で始まる必要があります。また、中央にダッシュ(または一重引用符)を埋め込むことはできますが、2行には埋め込むことはできません。

「適切なUnicode文字」という用語は、適切なものがわかっているという質問に答えるものです。

ASCII文字を超えて選択するとあまりにも漠然としていることがわかります。私はPerl6の::文法ではこの生産ではなく、<.ident>の定義見つける:

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

をしかし、これはまた、あなたが識別子が識別子を定義することが何であるかを知っている必要があります質問を頼みます。だから、<.ident>はどこですか?

raiphが指摘しているのは<.ident>での方法はQRegex::Cursorですが、それはnqp::const::CCLASS_WORDで定義されています。今私はそれを追跡する必要があります。


は、私は高価な正方形の操作の結果を中心に渡したい、とちょっと、Perl 6のは、これを許可することになっているので、U + 00B2(SUPERSCRIPT TWO)(一般的なカテゴリがありません、Other_Number)を使用してみました:

my $a² = $a**2; 

しかし、²は他の上付き文字と共に演算子であることがわかります。それは大丈夫ですが、²などはlisted as an operatorまたは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 

しかし、私はノーの1/2 U + 00BD(VULGAR FRACTION ONE HALF)(一般的なカテゴリを使用することはできませんし、 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ラインでブロック内
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 ⏏$ΔΔ; 

ここでは何が起こっていますか?

+0

上付き文字がで事業として記載されていますオンラインの識別子セクション:[Identifiers](https://docs.perl6.org/language/syntax#Identifiers)。 – callyalater

+0

上付き文字は今掲載されていますが、私はこの質問をしたときではありませんでした。削除された回答は、それを記した問題としてhttps://github.com/perl6/doc/issues/1098を参照しています。 –

答えて

8

文法識別子ですidentCCLASS_ALPHABETIC文字またはアンダー_で始まり、ゼロ以上CCLASS_WORD文字に続く入力を受け付けるmethod on cursorsdefined as

token apostrophe { 
    <[ ' \- ]> 
} 

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

を有しています。

これらのクラスはimplemented in MoarVMであり、さまざまなUnicodeカテゴリに対応しています。

具体的には、CCLASS_ALPHABETICは、のレター、小文字を確認します。; レター、大文字; レター、タイトルケース; レター、修飾子およびレター、その他

CCLASS_WORDはさらに、カテゴリの数字、小数点以下の桁番号、およびアンダースコアを受け入れます。

なぜ、後置演算子が識別子を壊さないのかは、最長のトークンマッチングによるものです。

あなたは変数に後置演算子Δを呼び出したい場合は、バックスラッシュを追加する必要があり、すなわち

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

や「unspace」

say $Δ\ Δ; 
+2

バックスラッシュは空白で、元に戻すスペースはありません。また、後置演算子 'say postfix:<Δ> $Δ;'の完全修飾名を使用することができます。 –

関連する問題