Synopsis 3: Perl 6 演算子
Luke Palmer <luke@luqui.org> Larry Wall <larry@wall.org> Darren Duncan <darren@darrenduncan.net>
Created: 8 Mar 2004 Last Modified: 6 Aug 2011 Version: 227
Perl 5 からの変更のサマリーのために、 Perl 5 演算子に対する変更を見ろ。
Perl 6 は場所で Perl 5 、しかしそれらが異なって取り決められるとだいたい同じ優先レベルの数を持つ。 ここで我々は、それぞれのレベルの少数の例とともに、「「最もきつい」」から「「最も緩い」」にレベルをリストする:
A Level Examples
= ===== ========
N Terms 42 3.14 "eek" qq["foo"] $x :!verbose @$array
L Method postfix .meth .+ .? .* .() .[] .{} .<> .«» .:: .= .^ .:
N Autoincrement ++ --
R Exponentiation **
L Symbolic unary ! + - ~ ? | || +^ ~^ ?^ ^
L Multiplicative * / % %% +& +< +> ~& ~< ~> ?& div mod gcd lcm
L Additive + - +| +^ ~| ~^ ?| ?^
L Replication x xx
X Concatenation ~
X Junctive and &
X Junctive or | ^
L Named unary sleep abs sin temp let
N Structural infix but does <=> leg cmp .. ..^ ^.. ^..^
C Chaining infix != == < <= > >= eq ne lt le gt ge ~~ === eqv !eqv
X Tight and &&
X Tight or || ^^ // min max
R Conditional ?? !! ff fff
R Item assignment = => += -= **= xx= .=
L Loose unary so not
X Comma operator , :
X List infix Z minmax X X~ X* Xeqv ... E
R List prefix print push say die map substr ... [+] [*] any Z=
X Loose and and andthen
X Loose or or xor orelse
X Sequencer <==, ==>, <<==, ==>>
N Terminator ; {...}, unless, extra ), ], }
2を使って! 同じ優先、指定された結合を持っている何でも演算子についてペアにする属性的に表すべき下のシンボルが上に2進法の演算子のために次のように解釈される:
Assoc Meaning of $a ! $b ! $c
===== =========================
L left ($a ! $b) ! $c
R right $a ! ($b ! $c)
N non ILLEGAL
C chain ($a ! $b) and ($b ! $c)
X list infix:<!>($a; $b; $c)
これが解釈される unaries のために:
Assoc Meaning of !$a!
===== =========================
L left (!$a)!
R right !($a!)
N non ILLEGAL
(スタンダード Perl にスタンダード演算子が首尾一貫して同様そうであるそれぞれの優先レベルで接頭辞あるいは後尾辞から、結合性を利用することができる unaries がない。)
リスト結合性(X)がただ同一の演算子の間に機能するだけであることに注意を払え。 もし2つの異なったリスト - 結合の演算子がお互いと括弧があいまいさを排除するために使われなくちゃならない優先、それらが非結合性だと考えられる同じことを持つなら。
例えば、X 演算子を渡るそしてZ zip 演算子が共にわずか「リストインフィックス」の1つの優先順位を持っている:
@a X @b Z @c
非合法であって、そして同じぐらい同様書かれなくちゃならなの :
(@a X @b) Z @c @a X (@b Z @c)
もしリスト - 結合の演算子の唯一の実装が2進法であるなら、それは右連想として扱われるだろう。
標準的な優先レベルはそれら結合性、しかしユーザー定義の演算子の点で一貫しようと試みる、そして優先レベルが同じ優先レベルで権利と左連想演算子を混ぜるかもしれない。 もし2つの相いれない演算子があいまいにお互いと括弧があいまいさを排除するために使われなくちゃならない展開式、演算子が非結合性だと見なされるであろう同じことで使われるなら。
もしあなたが上にあなたの大好きな演算子を見ないなら、次節は優先オーダーですべての演算子をカバーする。 基本的な演算子記述がここにある;特別なトピックはその後カバーされている。
これは本当に優先レベルじゃない、しかし、演算子が項よりもっときつい優先を持つことができないから、それはここ(に・で・は)ある。 種々の項のより長い記述のために S02 を見ろ。 ここに若干の例がある。
Int リテラルだ
42
Num リテラルだ
3.14
非補間Str リテラルだ
'$100'
補間Str リテラルだ
"Answer = $answer\n"
一般化Str リテラルだ
q["$100"] qq["$answer"]
Heredoc
qq:to/END/
Dear $recipient:
Thanks!
Sincerely,
$me
END
配列生成するもの
[1,2,3]
内部にリストコンテキストを供給する。 (専門的に、それは本当に「semilist」コンテキストを供給する、そしてそれはそのそれぞれがリストコンテキストで解釈されて、そして次に最終のリストの中に連結される文のセミコロンによって分離されたリストだ。)
ハッシュ生成するもの
{ }
{ a => 42 }
中に空き、あるいは1対あるいはハッシュ、さもなければあなたが使わなくちゃならない一つのリスト皮切りがあるに違いないhash() あるいは%() その代わりに。
クロージャ
{ ... }
文が期待されるところ(に・で)見いだされるとき、すぐに実行する。 常にさもなければ内側スコープの評価を延期する。
キャプチャ生成するもの
\(@a,$b,%c)
まだそのコンテキストを知らない引数リストを表している抽象概念。
Sigiled 変数
$x @y %z $^a $?FILE &func &div:(Int, Int --> Int)
contextualizer 関数としてのシギル
$() @() %() &()
クォートのような表記法での正規表現
/abc/ rx:i[abc] s/foo/bar/
Transliterations
tr/a..z/A..Z/
レンジが使うことに注意を払え.. よりむしろ-.
型名
Num ::Some::Package
Subexpressions が括弧によって circumfixed される
(1+2)
括弧が内側に(文と異なり、ブロックで)一緒に連結されたすべての文の結果を返す文のセミコロンによって分離されたリストと解析される as a List のParcel. それがその後扱われる方法はその終局のバインディングに依存する。
括弧と一緒の関数呼び出し:
a(1)
項ポジションで、たとえその識別子が同じく意味は接頭辞を持っているとしても、識別子が括弧で括られた展開式によってすぐに後に続いた何でも常に関数呼び出しを表している項と解析される、それであなたは決してこのような場合優先のことで心配しなくてもよい。 従って:
not($x) + 1 # means (not $x) + 1 abs($x) + 1 # means (abs $x) + 1
Pair 生成するもの
:limit(5) :!verbose
リテラルのシグネチャー
:(Dog $self:)
暗黙のインボカントと一緒のメソッド呼び出し
.meth # call on $_ .=meth # modify $_
これが起こるかもしれないとは、ただ項が期待されるところ(に・で)、注意しろ。 後置が期待されるところで、それは後置だ。 もしただインフィックスだけが(すなわち、項の後に介入している空白文字で)期待されるなら、.meth 構文エラーだ。 (.=meth ただスペシャルがあるから、形式がそこ(に・で)許される.= 意味規則でメソッド呼び出しフォームと等しい、しかし中間で空白文字を許す割り当て演算子を挿入する= そしてメソッド名。)
リスト演算(左方)
4,3, sort 2,1 # 4,3,1,2
Perl 5 、それが左手にカンマよりもっときつい、しかし右手にカンマより緩くバインドする演算子が左に、それほど項のように展開式にように見える傾きのように - List が下に優先を前接続するのを見ろ。
ドットが添え字のためにオプションであるけれども、すべてのメソッド後置はドットで始まる。 これらが最もきつい標準的な演算子だから、あなたはしばしば一連のメソッドについてただ複雑な名前を表現する一つの項としての呼び出しを考えることができる。
もっと多くのメソッドが呼び出す一つのディスパッチのディスカッションのために S12 を見ろ。
メソッドが呼び出す標準的なシングル - ディスパッチ
$obj.meth
標準的な一つのディスパッチのメソッド呼び出しの変形
$obj.+meth $obj.?meth $obj.*meth
普通の(人たち・もの)のほかに. メソッド祈り、変形がある.*.?そして.+ 同一名の多数の関連したメソッドがどのように扱われるかをコントロールするために。
クラスによって修飾されたメソッド呼び出し
$obj.::Class::meth $obj.Class::meth # same thing, assuming Class is predeclared
Perl のように5、が配車係にどのクラスから探索し始めるべきか教える、呼び出すべき正確なメソッドじゃない。
突然変異しているメソッド呼び出し
$obj.=meth
.= 演算子が左手にオブジェクトの inplace 修正をする。
メタメソッド呼び出し
$obj.^meth
.^ 演算子がクラスメタメソッドを呼び出す;foo.^bar 賛成で短いfoo.HOW.bar.
メソッドのような postcircumfixes
$routine.()
$array.[]
$hash.{}
$hash.<>
$hash.«»
これらの dotless フォームはまったく同じオペレータ順位文法を持っている。
他のいかなる後置演算子でものドットを打たれたフォーム
$x.++ # postfix:<++>($x)
他のいかなる接頭辞演算子でものドットを打たれた後置フォーム
$x.:<++> # prefix:<++>($x)
特にノーがあるinfix:<.> 演算子、そうだ
$foo . $bar
常にコンパイル時エラーがユーザーが使うべきであることを示すという結果になるだろうinfix:<~> その代わりに。 これは Perl 5 プログラマー学習 Perl 6 によってされる可能性が高いエラーをとらえるはずだ。
C、これらの演算子インクリメントあるいはデクリメントのように、それが前にあるいは後で置かれるかどうかについて、問題のオブジェクトはあるいは値の前か後に依存して、オブジェクトからとられる。 同じくCのように、シングルへの多数の参照がオブジェクトを突然変異させるという状態で、展開式がもたらすかもしれない同じことで若干の明示的な順次演算子が挿入されない限り未定義の振る舞い。 Sequence ポイントを見ろ。
Perl 6 にすべての後置演算子で、スペースが項とその後置の間に許されない(とき・から・につれて・ように)。 なぜかについて、そして「unspace」でどのように制限に取り組むべきかについて、 S02 を見ろ。
メソッドを突然変異させるとして、これらすべての演算子は同じ型の演算数と帰りの型に結果をディスパッチする、しかし、(不変の)値が変更可能なコンテナで記憶される場合に限り、それらは値型に正当だ。 しかしながら、そのままの未定義の値(中に適切Scalar
コンテナ)中にそれ自身を突然変異させるべき許可であるInt 共通慣用句をサポートするために:
say $x unless %seen{$x}++;
増加するStr (適切なコンテナで) Perl 5 と同様に働く、しかし少し一般化される。
ではないが通り過ぎて(それより)優先されたスキャンが文字列で最終の英数字のシーケンスのために作られる「.」文字. Perl 5 の場合と異なり、この英数字のシーケンスは文字列の始まりに固定される必要がない、同様にそれは;文字列での最終のシーケンスがマッチしているという状態で、で始まる段落にアルファベット文字を必要としない<!after '.'> <rangechar>+
何がそれの前に来るかにかかわらず、増加する。
<rangechar> 文字クラスが、定義された下として、インクリメントにレンジの中で Perl がどのように知っている文字のそのサブセットと定義される。
追加のマッチしている行動は2つの有用な利益を提供する:ファイル名を増加させることについてのその典型的な使用のために、あなたはパス名あるいは拡張のことで心配しなくてもよい:
$file = "/tmp/pix000.jpg"; $file++; # /tmp/pix001.jpg, not /tmp/pix000.jph
多分いっそうポイントをついていて、もしあなたがインクリメントに起こるなら、10進数で終わる1つの文字列で、それは正しいことをする可能性が高い:
$num = "123.456"; $num++; # 124.456, not 123.457
文字ポジションが数値 0..9 あるいはそれを表すとみなされる Unicode レンジが(そのために)完全な循環しているアルファベットであるとみなされる何のための(彼・それ)らの自然のレンジもの中で増加する(1つのケースの)(Unicode)スクリプト. ただ他のアルファベットのサイクル独立を形成する符号位置で(彼・それ)らのアルファベットを表すスクリプトだけが使われてそうであるかもしれない。 (英字の適切なサイクルを決定することに対して、この仕様はこのようなスクリプトのユーザーに従う。) 我々はその範囲で文字を利用する他のスクリプトと交差しないために独断的に ASCII アルファベットを定義する、しかし ASCIIの英字を点在させるアルファベットが許されない。
もし文字列位置の現在の文字がこのような範囲での最終の文字であるなら、それはレンジの最初の文字にラップして、そしてそれの残されたポジションに1「キャリー」を送る、そしてそのポジションはそれから、それ自身の範囲で増加する。 もし左端ポジションがその範囲で使い尽くされている場合に限り、そしてその場合には必ず、同じレンジの付加的文字が Perl 5 と同じファッションで走行距離を持つために差し込まれる、それで「(aaa00)」の中に「(zz99)」曲がり角を増加させることと、「(99zz)」を増加させることは「(100aa)」に変わる。
次の Unicode レンジは可能な rangechar レンジの若干だ。 我々がレンジを持っているかもしれないアルファベットのために:
A..Z # ASCII uc a..z # ASCII lc Α..Ω # Greek uc α..ω # Greek lc (presumably skipping C<U+03C2>, final sigma) א..ת # Hebrew etc. # (XXX out of my depth here)
我々がレンジを持っている数値のために:
0..9 # ASCII ٠..٩ # Arabic-Indic ०..९ # Devangari ০..৯ # Bengali ੦..੯ # Gurmukhi ૦..૯ # Gujarati ୦..୯ # Oriya etc.
レンジが同じくそうであるかもしれない 0..9 が増加させた他の非スクリプト、そんなものけれども
⁰..⁹ # superscripts (note, cycle includes latin-1 chars) ₀..₉ # subscripts 0..9 # fullwidth digits
Conjecturally 、共通の連続がそうであるかもしれない何も、たとえそれが 0..9 を表さないとしても、サイクルとして扱われる
Ⅰ..Ⅻ # clock roman numerals uc ⅰ..ⅻ # clock roman numerals lc ①..⑳ # circled digits 1..20 ⒜..⒵ # parenthesize lc ⚀..⚅ # die faces 1..6 ❶..❿ # dingbat negative circled 1..10 etc.
それらがそれらサイクルの終わりに達するとき、このような数を「振る舞う」ことが本当に意味をなさない間に、 incrementable のような値を扱うことはアウトラインと類似のナンバーが付けられた銃弾品目を書くことに向いているかもしれない。 (インクリメントに文字列のどの部分か知る前に、我々が rangechars の文字列の最終のシーケンスを見つけなければならないから、我々がただ認められない文字を増加させることができないとは、注意しろ。 同じく、我々がサイクルとオーバーラップすることを含まないために我々のレンジを明確にしたから、すべての文字増加が後継者の一人用のテーブルでルックアップによって扱われることができることに注意を払え。)
6が同じくサポートする Perl Str 類似の意味規則と一緒のデクリメント、ただ、サイクルに他の方向の負担を強いることによって。 しかしながら、左端文字が決して取り去られない、そして、あなたが「あああ」あるいは「000」のように文字列に着くとき、デクリメントは失敗する。
非 - に関するインクリメントとデクリメントStr 型が定義されることに関して.succ そして.pred オブジェクトの型の上のメソッドでScalar
コンテナ。 もっと具体的に言うと、
++$var --$var
同等であるそうすること
$var.=succ $var.=pred
もし型がこれらのメソッドをサポートしないなら、対応するインクリメントあるいはデクリメント演算は失敗するだろう。 (オプティマイザは整数に関する普通のインクリメントとデクリメント演算がオーバーライドされないであろうと想定することを許される。)
増加するBool (適切なコンテナで)それを真にする。
それが何度前に増加したかにかかわらず、デクリメントがそれを偽にする。 これは有用なもしであるあなた%seen ハッシュが実際にであるKeySetデクリメントが実際にどのケースからそれを削除するかについてKeySet.
未定義のインクリメント / デクリメントNumericCoolあるいはAny 変数が変数を0にセットして、そして次にインクリメント / デクリメントを実行する。 従ってポストインクリメントが0を最初のときリターンする:
my $x; say $x++; # 0, not Any
Autoincrement prefix:<++> あるいはpostfix:<++> 演算子
$x++ ++$x;
Autodecrement prefix:<--> あるいはpostfix:<--> 演算子
$x-- --$x
infix:<**> べき乗演算子
$x ** 2
右の引数が負でない整数じゃないなら、結果は近似である可能性が高い。 もし右の引数がそうであるなら、整数型について、べき乗が左側の型に少なくとも繰り返された乗算と同じぐらい正確だ。 (それがどちらからに得るかがそれを推論したInt**UInt
それ以来、常に正確だInt 随意精度をサポートする。
Rat**UInt 精度まで正確であrnoRat.) もし右の引数が非整数型で表された整数であるなら、正確さはその型によって提供された実装に任せられる;整数がそれに特別な取り扱いを与えると認める必要がない。
(整数の強要Str としてCool しかしながら、正しいことをする可能性が高い。)
prefix:<?>ブールのコンテキスト
?$x
ブールとして展開式を評価して、そして戻るTrue もし展開式が真であるならあるいはFalse さもなければ。
低い優先の代替物の間下に「そうである」を見ろ。
prefix:<!>ブールの否定
!$x
何かの反対を返す? そうするだろう。
下に低い優先の代替物のために "not" を見ろ。
prefix:<+>数のコンテキスト
+$x
Perl 5 の場合と異なり、どこ(で・に)+ 無操作命令だ、この演算子は数値的に Perl 6 のコンテキストを強制する。 (それはただ、オリジナルの変数ではなく、値だけを強制する。) すでにしない値のためにNumeric ロール、適切な最も狭いもの型のIntRatNumあるいはComplex 通り過ぎて;しかしながら、文字列が分離された2つの整数を含んでいるという状態で、返送されるだろう/ 返されるだろう as a Rat (あるいはFatRat もし分母があふれるならint64). 指数の表記法と底表記法が認識される。
prefix:<->数の否定
-$x
数値的と復帰に結果として生じている数の算数否定を強制する。
prefix:<~>文字列コンテキスト
~$x
もしそれがすでにしないなら、文字列に値を強制するStringy
ロール。 (それはただ、オリジナルの変数ではなく、値を強制するだけだ。) 数字と同じように、それは保証されている、ただから何かに強制しろStringy必ずしもStr.
prefix:<|>arglist の中にオブジェクトを平らにする
| $capture
中身を補間挿入すのCapture (あるいはCapture- 好む)値が(すでに)それらであるかのように現在の引数リストの中に文字通りに指定されていた.
もしキャプチャの最初の引数がインボカントとして記録されているが、1(人・つ)を期待しないコンテキストで使われるなら、それは普通の位置引数として扱われる。
prefix:<||>セミコロンリストの中にオブジェクトを平らにする
|| $parcel
要素を補間挿入すのParcel (あるいは他のいかなる順序づけられた値でも)すなわち、多次元のレベルにおいて引数リストが、セミコロンのそばに、それらが指定されたかのように文字通りに、分離した流れに打ち込んでいる.
コンテキスト;言い換えればそれが中にバインドされなくちゃならない lol の外でこの演算子を使うことはエラーである** (スライス)パラメータよりむしろ* (素晴らしい)パラメータ。
prefix:<+^>数のビットワイズ否定
+^$x
Coerces をそうすることInt そしてそれから、戻って、数にビットワイズ否定をするInt. (順に1の、 infinitude を表さなくてもよいことは2の補数形式でいずれかの否定としてその値を表す。)
prefix:<~^>文字列ビットワイズ否定
~^$x
(buf8 、 buf16 、あるいは buf32 のような)非変数 - エンコーディング文字列バッファー型に NFG 文字列を強制して、そして次に、インプットと同じサイズのバッファーを返して、それぞれの整数要素のそれぞれのビットに関する否定(補完)をする。
しかしながら、強要の使用はおそらく設計ミスを示す。 この演算子は左よりむしろ右手に拡張するビットベクトルを提供する(そして常に符号のない拡張をする)ために数のビットワイズ否定から区別される。
prefix:<?^>ブールの否定
?^$x
ブールそして次にフリップにビットを強制する。 (同じけれども!.)
prefix:<^>upto 演算子
^$limit
レンジを作成すの0 ..^ +$limit あるいは賛成の近道としてのメタクラスを見つける$limit.HOW. レンジと RangeIter 意味規則を見ろ。
infix:<*>
$x*$y
2(人・つ)のより広い型をもたらして、乗算。
infix:</>
$numerator / $denominator
実数あるいは適切な型の複素数を返して、実数あるいは複素数の除算を行なう。
もし両方の演算数が整数型の(こと・もの)であるなら、演算子は文通することを返すRat 値。
さもなければ、いずれかの演算数がそれについてであるもしComplex 型、両方の演算数をそうするよう変換するComplex そして戻って除算をするComplex.
さもなければ、いずれかの演算数がそれについてであるもしNum 型、両方の演算数をそうするよう変換するNum
そして戻って除算をするNum. もし分母がゼロであるなら、いずれかを表しているオブジェクトを返す+InfNaNあるいは-Inf
分子が肯定的で、ゼロか、あるいは否定的である(とき・から・につれて・ように)。 (これは超演算子とジャンクションの中で演算子の可能な用途を考慮に入れて最も良いデフォルトと解釈される。 これらが実際はネイティブの IEEE 非数じゃないとは、しかしながら注意しろ; それらは未定義の値起きる「スローされない例外」型について対応する IEEE コンセプトともしを表している、あなたはその後非並列計算でこれらの値の1つを使おうとする、それはその時点で多分例外をスローするだろう。)
infix:<div>整数除算
$numerator div $denominator
そうするためのディスパッチinfix:<div> 多大部分が演算数に同じ型の値を返している型を私物化する。
強制的じゃなくて、それで異なった型の上の失敗。
ゼロによって除算について何をするべきかについてのポリシーは型次第だ、しかし超演算子とジャンクションのためにオーバーフロー(あるいはそれはスローされない例外を含むことができる)を表すことができるそれらの型はただ例外をスローするよりむしろそうしようとするべきだ。 (そして一般的な、他の演算子でかもしれない失敗が同じく見なすべきだ、それらが超演算子とジャンクションで、そしてそれらか否かにかかわらず使うことは有利にいい加減な例外モデルから利益を得ることができる。)
一般に、div 同じ結果を与えるべきであるけれども
$x div $y == floor($x/$y);
けれども帰りの値は $x と同じ型であるべきだ。
infix:<%>法
$x % $y
もし必要なら、そうするための数でない引数を強制する適切Numeric 型が、それでそうな残りを計算する定義するけれども :
$x % $y == $x - floor($x / $y) * $y
infix:<%%>通り過ぎて可分だ
$x %% $y
能力を発揮する% そして次にテスト、戻っている0に対する結果Bool::True もし$x 通り過ぎて均等に可分だ$yそしてBool::False さもなければ。
あなたは使ってもよい!%% けれども、「通り過ぎて可分じゃない」を意味するために% 一般に、それ自身同じ影響を持つ。
infix:<mod>整数法
$x mod $y
そうするためのディスパッチinfix:<mod> 多大部分が演算数に同じ型の値を返している型を私物化する。
強制的じゃなくて、それで異なった型の上の失敗。
これは識別情報を保存するべきだ
$x mod $y == $x - ($x div $y) * $y
infix:['+&']数のビットワイズそして
$x +& $y
両方の引数をそうするよう変換するInt そして戻って、それぞれの整数の対応するビットの間にブールの AND をするInt 結果として生じろ。
infix:['+<']数の左シフト
$integer +< $bits
infix:['+>']数の右シフト
$integer +> $bits
通り過ぎて型が符号なし型がそうしない、しかしこれが使用可能であるか、あるいは使用不能であるかもしれない間に符号拡張をするデフォルト、符号付き:signed あるいは:!signed 副詞。
infix:<~&>バッファービットワイズそして
$x ~& $y
(buf8 、 buf16 、あるいは buf32 のような)非変数 - エンコーディング文字列バッファー型に NFG 文字列を強制して、そして次に、論理的に0の値でより短いバッファーを埋めて、2つのバッファーの対応する整数の上に数のビット単位の論理積をする。 (AND のためにせいぜい2つのバッファーのより短い(人たち・もの)の大きさである)すべてのゼロ以外の整数結果を含んでいるのに十分大きいバッファーを返す。
しかしながら、強要の使用はおそらく設計ミスを示す。 この演算子は左よりむしろ右手に拡張するビットベクトルを提供する(そして常に符号のない拡張をする)ために数のビット単位の論理積から区別される。
infix:['~<']バッファービットワイズ左シフト
$buf ~< $bits
infix:['~>']バッファービットワイズ右シフト
$buf ~> $bits
されたではないがデフォルトまでにただ可能にされるかもしれない符号拡張:signed
副詞。
infix:<?&>ブールそして
$x ?& $y
両方の引数を型に変換するBool そしてそれから、結果として生じることを返して、人たちの AND をとるBool.
infix:<gcd>最も大きい共通除数
$x gcd $y
不可欠な型までの両方の引数を変換して、そして次に両方の引数が均等に可分の最も大きい整数を見いだして、そしてその整数を返す。
infix:<lcm>最少の共通倍数
$x lcm $y
不可欠な型までの両方の引数を変換して、そして次に均等に両方の引数で分けられる最小の整数を見いだして、そしてその整数を返す。
演算子が回転演算子に変えられるかもしれない Any ビットシフト:rotate 副詞。 もし:rotate 指定される、符号拡張のコンセプトは無意味だ、そしてあなたは指定してはならない:signed 副詞。
infix:<+>数の付加
$x + $y
Microeditorial :これらの演算子、何でもの大部分と同じように強要あるいは型不適当な組合わせが実際に多数のディスパッチによって扱われる。 意志はすべてのそのような変形が結果を持つために多分記憶された数の結果でふさわしく「大きい」数の型を産み出すために数の付加の概念を維持するということだ。 過負荷ではなくする+ 結合のような、他の目的のための演算子。 (そしてどうか「項目から離れて」使用のために我々が存在する演算子に負担をかけ過ぎるよりずっと良くあなたのために異なった演算子を補うことがだと感じる一般に I/O.) にするべきビットシフト演算子に負担をかけ過ぎないでくれ。 Unicode のすべてがこの目的のために利用可能だ。
infix:<->数の引き算
$x - $y
infix:<+|>数字ビットとして、すべてを含んでいるあるいは
$x +| $y
両方の引数をそうするよう変換するInt そして戻って、それぞれの整数の対応するビットの間にブールのORをするInt 結果として生じろ。
infix:<+^> 数のビットワイズ排他的論理和
$x +^ $y
両方の引数をそうするよう変換するInt そして戻って、それぞれの整数の対応するビットの間にブールの XOR をするInt 結果として生じろ。
infix:<~|>バッファービットワイズが包括的であるという状態で、あるいは
$x ~| $y
(buf8 、 buf16 、あるいは buf32 のような)非変数 - エンコーディング文字列バッファー型に NFG 文字列を強制して、そして次に、論理的に0の値でより短いバッファーを埋めて、2つのバッファーの対応する整数の上に数のビット単位の論理積をする。 (OR のためにせいぜい2つのバッファーのより長い(人たち・もの)のサイズである)すべてのゼロ以外の整数結果を含んでいるのに十分大きいバッファーを返す。
しかしながら、強要の使用はおそらく設計ミスを示す。 この演算子は左よりむしろ右手に拡張するビットベクトルを提供する(そして常に符号のない拡張をする)ために数のビット単位の論理積から区別される。
infix:<~^> バッファービットワイズ排他的論理和
$x ~^ $y
(buf8 、 buf16 、あるいは buf32 のような)非変数 - エンコーディング文字列バッファー型に NFG 文字列を強制して、そして次に、論理的に0の値でより短いバッファーを埋めて、2つのバッファーの対応する整数の上に数のビット単位の排他的論理和をする。 (XOR のためにせいぜい2つのバッファーのより長い(人たち・もの)のサイズである)すべてのゼロ以外の整数結果を含んでいるのに十分大きいバッファーを返す。
しかしながら、強要の使用はおそらく設計ミスを示す。 この演算子は左よりむしろ右手に拡張するビットベクトルを提供する(そして常に符号のない拡張をする)ために数のビット単位の排他的論理和から区別される。
infix:<?|>ブールが包括的であるという状態で、あるいは
$x ?| $y
両方の引数を型に変換するBool そしてそれから、結果として生じることを返して、それらの OR をとるBool.
infix:<?^> ブールの排他的論理和
$x ?^ $y
両方の引数を型に変換するBool そしてそれから、結果として生じることを返して、それらの XOR をとるBool.
infix:<x>文字列 / バッファー複製
$string x $count
文字列コンテキストで左の引数を評価して、回数が右の引数までに指定した結果として生じている文字列値を繰り返して、そして、シングルがコンテキストにかかわらず文字列を連結した(とき・から・につれて・ように)、結果を返す。
もしカウントが1以下であるなら、空の文字列を返す。
カウントはそうじゃないかもしれない* なぜなら Perl 6 は無限の文字列をサポートしないから。 (もうではなく、少なくとも...) しかしながら、無限の文字列がいつか模倣されるかもしれないことに注意を払えcat($string xx *)どちらのケースにか$string x * それのために速記であるかもしれない。
infix:<xx>リスト複製
@list xx $count
リストコンテキストで左の引数を評価して、結果として生じることを繰り返すParcel 回数が右の引数までに指定して、そしてのリストとして結果を返す値Parcels (それは、それが平らなコンテキストあるいは lol コンテキストの中にバインドされるかどうかについて、依存して異なって振る舞うだろう)。
もしカウントが1以下であって、空リストを返すなら、(). もしカウントがそうであるなら*帰り無限のリスト(いい加減に、リストがデフォルトまでにいい加減だから).
infix:<~>文字列 / バッファー結合
$x ~ $y
infix:<&>すべての () 演算子
$a & $b & $c ...
ジャンクションが比較を再注文することを可能にされるデフォルトまでに何でもそれがオプティマイザに意味をなすように命ずる。 使用で、これを隠すことS 連続的な評価、どちらかがとして同じ意味規則で AND をとられたパターンのリストを作成するであろう力のためのメタ演算子infix:<&>しかし左から右の評価が保証されているという状態で、ガードされているパターンでの使用のために:
$target ~~ MyType S& *.mytest1 S& *.mytest2
後のテストが例外をスローするかもしれないとき、これは、もしより以前のテストがパスしないなら有用だ。 これは通り過ぎて保証されているはずがない:
$target ~~ MyType & *.mytest1 & *.mytest2
infix:<|>どんな () 演算子でも
$a | $b | $c ...
ジャンクションが比較を再注文することを可能にされるデフォルトまでに何でもそれがオプティマイザに意味をなすように命ずる。 使用で、これを隠すことS 連続的な評価、どちらかがとして同じ意味規則で OR をとられたパターンのリストを作成するであろう力のためのメタ演算子infix:<|>しかし左から右の評価で、左の引数が権利よりずっと容易に falsifiableであるガードされているパターンでの使用のために:保証されている
$target ~~ *.mycheaptest S| *.myexpensivetest
あなたが安全性について順にテストを行なうことを望むとき、これは同じく有用だ:
$target ~~ MyType S| *.mysafetest S| *.mydangeroustest
infix:<^>1つの () 演算子
$a ^ $b ^ $c ...
S^ 変形がコンテキストがショートする左から右の、そしてブールの評価が、もしそれが2番目のマッチを見るなら偽であると保証する。
1つの引数の関数
sleep abs sin ... # see S29 Functions
Perl 5 の場合と異なり、あなたが使わなくちゃならないことを注意する.meth デフォルトとするべきフォーム$_ 中にいる Perl 6。
単項のノーがあるrand あるけれども、 Perl に6を前接続する.rand
メソッド呼び出しと引数のないrand 項。 単項のノーがあるint
いずれかを前接続しろ;あなた不可欠は型キャストを使う、から型がそんなものを使うけれどもInt あるいはint. (型キャストが括弧を必要として、そして接頭演算子として使われないかもしれない。)
言い換えれば:
my $i = int $x; # ILLEGAL
構文エラー(一列に並んだ2つの項)だ、なぜならint 今型名だ。
prefix:<int>
けなされて、使用Int() coercion あるいは the floor 関数。
prefix:<sleep>
Coerces から an 適切Real 型が、それからわずかであるかもしれない秒後の指定された数で実行の現在のスレッドを停止する。 それを覚えているけれどもRat アト秒精度の能力がある、あなたのコンピュータはおそらくアト秒正確さの能力がない。
prefix:<abs>
指定された引数の絶対の値を返す。
infix:<but>
$value but Mixin
infix:<does>
$object does Mixin
Sort 比較
$num1 <=> $num2 $str1 leg $str2 $obj1 cmp $obj2
これらの演算子は数値的を使っている(彼・それ)らの演算数、文字列を比較する、あるいはeqv それぞれ意味規則と秩序に関して依存することが1(人・つ)を返すのOrder::IncreaseOrder::SameあるいはOrder::Decrease
(それは、-1に、0、あるいは+1を数値化する)。 比較意味規則を見ろ。
レンジオブジェクトコンストラクタ
$min .. $max $min ^.. $max $min ..^ $max $min ^..^ $max
Constructs Range オプションとして片方か両方の末端を除外して、オブジェクト。
レンジと RangeIter 意味規則を見ろ。
この優先レベルの上のすべての演算子は鎖でつながれるかもしれない;連鎖式比較を見ろ。 それらがすべて論理値を返す。
infix:<==> など.
== != < <= > >=
Perl 5 に、変換するようにそうするためにNum 比較の前に。 != 賛成で短い!==.
infix:<eq> など.
eq ne lt le gt ge
Perl 5 に、変換するようにそうするためにStr 比較の前に。 ne 賛成で短い!eq.
一般的な注文
$a before $b $a after $b
Smart マッチ
$obj ~~ $pattern
Perl 5 の=~ 「スマートなマッチ」演算子になる~~意味規則の延長されたセットで。 詳細のためにマッチしている Smart に会え。
「brainos」、 Perl 6 パーサーが定義するキャッチにinfix:<=~>
メッセージがユーザーを使用に導くという状態で、常にコンパイル時間に失敗する演算子~~ あるいは~= (文字列付加)その代わりにもしそれらがそれを一つの演算子として意図したなら、あるいはスペースをもしの間に置くために、2が演算子を分離する(とき・から・につれて・ように)、それらが本当に文字列化された値を割り当てることを望んだ。
否定されたスマートなマッチが意味される!~~.
コンテナ識別情報
VAR($a) =:= VAR($b)
比較意味規則を見ろ。
値識別情報
$x === $y
値型じゃないオブジェクトのために、それら識別情報はそれら値だ。
(識別情報は通り過ぎて返送されている.WHICH メタメソッド。) オブジェクトの実際の内容は無視される。 これら意味規則がキーのためにオブジェクトを許すハッシュによって使われるそれらである. 同じく比較意味規則を見ろ。
それに注意しろ=== 定義されで(Any,Any) シグネチャーとそのためにジャンクションの上の自動スレッド;従ってそれは2つのオブジェクトが同じであるかどうか、いずれかあるいはそれらの両方ともがジャンクションであるかどうか決定するために使われることができない。 しかしながら、それ以来.WHICH 決して自動スレッドではなく、常に値を返すマクロだ、あなたは、言うことによって、容易にこの限界に取り組むことができる:
$junk1.WHICH eqv $junk2.WHICH
規準的な同等
$obj1 eqv $obj2
規準的な同等のために2つのオブジェクトを比較する。 値型のために値を比較する。 オブジェクトタイプのために、標準化のいずれかの案によれば、現在の内容を比較する。 これら意味規則が(Perl 5 の文字列が主要なハッシュのような)キーのためにただ値だけを許すハッシュによって使われるそれらである. 同じく比較意味規則を見ろ。
それに注意しろeqv ジャンクションの上の自動スレッドそうする他のすべての比較演算子. (これらがブールの値;一般的な、ただブールのみのコンテキスト力でジャンクション崩壊を返すという事実によって混乱させられるな。)
関係演算子を否定した
$num !== 42 $str !eq "abc" "foo" !~~ /^ <ident> $/ VAR($a) !=:= VAR($b) $a !=== $b $a !eqv $b
否定された関係演算子を見ろ。
infix:<&&>ショートそして
$a && $b && $c ...
偽でそうするそれが評価する最初の引数を返して、さもなければ最後の引数の結果を返す。 コンテキストが偽の帰りに意味することを強いるリストで(). 見ろand 下に低い優先のバージョンのために。
infix:<||>ショート inclusive-or
$a || $b || $c ...
そうするそれが評価する最初の引数を真の値リターンして、さもなければ最後の引数の結果を返す。 それは特にブールとしてもそして値が、もしブールが真であるなら生産したリストとしても共にリストあるいは配列を使うことを可能にされる:
@a = @b || @c; # broken in Perl 5; works in Perl 6
この演算子が偽の帰りに意味することを強いるリストコンテキストで(). 見ろor 下に低い優先のバージョンのために。
infix:<^^>ショート排他的論理和
$a ^^ $b ^^ $c ...
もし1(人・つ)(そしてただ1(人・つ))があるなら、真の引数を返す。 もしすべての引数が偽であるなら、最後の引数を返す。 戻るBool::False
さもなければ(1以上の引数が真であるとき)。 コンテキストが偽の帰りに意味することを強いるリストで(). 見ろxor 下に低い優先のバージョンのために。
2番の後に真の引数が結果として生じることが何も評価しないという意味で、この演算子はショートする。 密接に関連した減算演算子:だ
[^^] a(), b(), c() ...
縮小する注目以外演算子がマクロではなくて普通のリスト演算子だ、それでc () が前に常に呼び出される減量するされる.
infix:<//>ショートデフォルト演算子
$a // $b // $c ...
定義された値、さもなければ帰りに最後の引数の結果を評価する最初の引数を返す。 コンテキストが偽の帰りに意味することを強いるリストで(). 見ろorelse 下に類似であるが、同一じゃない低い優先のバージョンのために。
最小・最大限
$a min $b min $c ... $a max $b max $c ...
これらは最小あるいは最大値を返す。 同じく見るminmax リスト演算。
すべての型が無限のコンセプトをサポートすることができるわけじゃない。 そのために型がそうであるかもしれない何の値でもそれと対照をなした何も+Inf あるいは-Inf 値、無限の値がどちらのケースに「より大きい / で可能な何かより小さい型の値を我慢するか。」 すなわち、
"foo" min +Inf # "foo" "foo" min -Inf # -Inf "foo" max +Inf # +Inf "foo" max -Inf # "foo"
オブジェクト型がサポートしなくちゃならないすべての orderable +Inf そして-Inf 未定義の値の特別なフォームとしての値。 しかしながら、それをサポートすることができないネイティブの型の中に無限の値を記憶しようと試みることはエラーだ:
my int $max; $max max= -Inf; # ERROR
条件付きの演算子
say "My answer is: ", $maybe ?? "yes" !! "no";
同じく「三進法」あるいは「trinary」演算子として知られていて、けれども我々はただ人々が項のことで争うのを阻止するために「条件付き」の方を好む。 演算子は3つの部分式の中に統語論上展開式を分離する。 それはブールのコンテキストで最初に左辺を評価して、それからそれに基づいて評価するべき他の2つの部分の1つを選択する。 (それは決してそれらの両方ともを評価しない。) もし条件文が真であるなら、それは真ん中の部分を評価して、そして下す;もし偽であるなら、右の人たちは別れる。 上の(人たち・もの)はそのために同等の値:だ
say "My answer is: ", do {
if $maybe {
"yes";
}
else {
"no";
}
};
それは優先、そんなものでもっと緩いそれがバインドする真ん中の部分の中の演算子を使用するべき構文エラーだ=.
my $x; hmm() ?? $x = 1 !! $x = 2; # ERROR hmm() ?? ($x = 1) !! ($x = 2); # works
両側が括弧で括られていなければならないことに注意を払え。 部分的な修正は wronger さえだ:
hmm() ?? ($x = 1) !! $x = 2; # parses, but WRONG
実際に解析をするけれども :
(
hmm() ?? ($x = 1) !! $x
) = 2;
そして常に任命者2 そうするために$x (から($x = 1) 正当な左辺値だ).
そして何ででも場合、繰り返しだ$x あなたに以前にそれを宣言することを強いる。
最も良く - が、簡単に:あなた自身解決がそうである - 繰り返さない
my $x = hmm() ?? 1 !! 2; # much better
infix:<?>
Cによって得られた言語(Perl 5 を含めて)、そのままの疑問に精通した人々によってありそうなエラーをキャッチするために、インフィックスポジションでのマークがそれを示唆している不具合、ユーザーの用途、を産み出すだろう?? !! その代わりに。
フリップフロップレンジ
start() ff end() start() ^ff end() start() ff^ end() start() ^ff^ end()
フリップフロップレンジ(sed スタイル)
start() fff end() start() ^fff end() start() fff^ end() start() ^fff^ end()
演算子副詞は文法でスペシャルをケースに入れられたが、項目割り当てより少しもっときつい擬似優先のレベルで単項の演算子をなびかせるとして、解析される外観を与える。 (それら、それらが空白文字の欠如を必要とし、そしてこれらが空白文字を許すから、公式にではなく「後置」演算子である. これらの副詞は(彼・それ)ら自身をパーサーがインフィックス演算子を期待している場所に挿入する、しかし、副詞を解析して、そしてそれを前の項に適用した後で、パーサーはインフィックスを探し続ける。) それで、
$a < 1 and $b == 2 :carefully
そうする== 慎重に、他方
$a < 1 && $b == 2 :carefully
そうする&& 慎重にから&& 「カンマ」よりもっときつい優先の(こと・もの)だ。 使用
$a < 1 && ($b == 2 :carefully)
副詞を適用すること to the == その代わりに演算子。 我々はそれを言う== それが副詞がもしかすると当てはまることができた解析樹のてっぺんにあるという意味で、「最高の」演算子だ。
(それは括弧の外(に・で)適用されることができなかった。) もしあなたが最高の演算子が何であるか不確かであるなら、ただあなた自身にどの演算子が最後に応用されるであろうか尋ねろ。 例えば、中に
+%hash{$key} :foo
添え字は最初に起きるそして+ 演算子がそれほど、最後に、起きる:foo それに適用されるだろう。 使用
+(%hash{$key} :foo)
適用されるために:foo 添え字化している演算子にその代わりに。
あなたがものが好むと言うとき、副詞が一般にあなたが欲する方法に付着するだろう
1 op $x+2 :mod($x)
提案された内部のテスト構文はこれらの優先順位規則を利用する:
$x eqv $y+2 :ok<$x is equivalent to $y+2>;
ここで副詞は変更されていると見なされるeqv 演算子。
infix:<=>
$x = 1, $y = 2;
単純な左辺値で、= カンマよりもっときついこの優先を持つ。
(リスト割り当てが下にリスト演算優先を持っている。)
infix:['=>']Pair コンストラクタ
foo => 1, bar => "baz"
2進=> もう単に「おしゃれなコンマ」じゃない。 今それ構造Pair とりわけ、パスするために使われることができるオブジェクトが引数を関数に任命した。 それは両側に項目コンテキストを供給する。
それは観念的な感覚を除いて実際に割り当てをしない;しかしながら、その優先は今割り当てと等しい、そしてそれは同じく右連想だ。 Perl 5 の場合と異なり、それに注意しろ=>
カンマよりしっかりとバインドする。
割り当て演算子
+= -= **= xx= .= etc.
割り当て演算子を見ろ。
prefix:<not>
not any(@args) eq '-v' | '-V'
戻るBool 展開式の論理否定を表している値。
prefix:<so>
so any(@args) eq '-v' | '-V'
戻るBool 展開式の論理的な非否定を表している値。
ドキュメンテーションとして並列にたいてい有用そうすることnot いつelse 適切じゃない:
if not $x { print "LOL"; }
mumble();
if so $x { print "SRSLY!" }
infix:<,>引数セパレータ
1, 2, 3, @many
Perl 5 の場合と異なり、コンマ演算子が決して最後の値を返さない。 (項目コンテキストでそれはその代わりにリストを返す。)
infix:<:>インボカントマーカー
say $*OUT: "howdy, world" say($*OUT: "howdy, world") push @array: 1,2,3 push(@array: 1,2,3) \($object: 1,2,3, :foo, :!bar)
コロン演算子はコンマとまったく同じように解析をするが、左に引数にさもなければ、メソッドの中に関数呼び出しであろうものが呼び出す向きを変える効果を持っているインボカントであるという記録を残す。 それはただ引数リストの最初の引数あるいはキャプチャで使われるかもしれなくて、そして解析でき損ねるだろう、もし何ででも他のポジションを使った。 キャプチャの中で使われるとき、それはそうじゃないもうキャプチャが何のシグネチャーに境界であろうか知る;もし非メソッドのシグネチャーにバインドされるなら、コロンが(今まで)コンマであったかのように、インボカントはただ最初の位置引数に変わる.
他のコロンフォームで混乱を避けるために、コロンインフィックス演算子は空白文字あるいはターミネータによって後に続かれなくちゃならない。 それはそれの前(に・で)オプションとして空白文字を持っているかもしれない。
注意しろ:このインフィックス演算子をコロンから区別しろ
@array.push: 1,2,3 @array.push(1,2,3): 4,5,6 push(@array, 1,2,3): 4,5,6
それは普通の関数を回す特殊形式だ、あるいはメソッドがリストの中に演算子を呼び出す。 特殊形式は認知される、ただドットのあるメソッドの後に呼び出し、あるいはメソッドの右の括弧あるいは関数呼び出しの後に。 特殊形式は介入している空白文字を許さない、しかし次の引数の前に空白文字を必要とする。 他のすべてのケースで、もし可能、あるいはさもなければインボカントマーカー(上記の挿入辞)なら、コロンが副詞のスタートとして解析されるだろう。
特別なコロンがただその引数の右の括弧の後に括弧で括られた引数リストにリスト演算引数を加えることを許されるのである考えるべきもう1つの方法であなたが短くすることを可能にされる、ただし書きを持っている、リスト.foo(): 1,2,3 下にそうするために.foo: 1,2,3. (けれどもただメソッドのために呼び出しが、普通の関数からコロンを最初にリスト演算、ただ空白文字に変わるために必要としない。
もしあなたがコロンで関数名を拡張しようとするなら、ラベルと思われる可能性が高い。)
foo $obj.bar: 1,2,3 # special, means foo($obj.bar(1,2,3)) foo $obj.bar(): 1,2,3 # special, means foo($obj.bar(1,2,3)) foo $obj.bar(1): 2,3 # special, means foo($obj.bar(1,2,3)) foo $obj.bar(1,2): 3 # special, means foo($obj.bar(1,2,3)) foo($obj.bar): 1,2,3 # special, means foo($obj.bar, 1,2,3) foo($obj.bar, 1): 2,3 # special, means foo($obj.bar, 1,2,3) foo($obj.bar, 1,2): 3 # special, means foo($obj.bar, 1,2,3) foo $obj.bar : 1,2,3 # infix:<:>, means $obj.bar.foo(1,2,3) foo ($obj.bar): 1,2,3 # infix:<:>, means $obj.bar.foo(1,2,3) foo $obj.bar:1,2,3 # syntax error foo $obj.bar :1,2,3 # syntax error foo $obj.bar :baz # adverb, means foo($obj.bar(:baz)) foo ($obj.bar) :baz # adverb, means foo($obj.bar, :baz) foo $obj.bar:baz # extended identifier, foo( $obj.'bar:baz' ) foo $obj.infix:<+> # extended identifier, foo( $obj.'infix:<+>' ) foo: 1,2,3 # label at statement start, else infix
もしあなたがコロンがどのようにそれを明確にするために空白文字あるいは括弧をバインドして、使おうとしているか知らないなら、物語の教訓は存在する。
リストインフィックスがすべて同一の2項演算子が他の後の(の・もの・人)よりむしろ並列に一緒に働くことを意味するリスト結合性を持っている。 同一でない演算子が非結合性だと見なされて、そして明快さのために括弧で括られているに違いない。
infix:<Z>活気演算子
1,2 Z 3,4 # (1,3),(2,4)
Z 演算子が実際は変化したケースであるのZ zipwith メタ演算子(下の Zip 演算子参照)。
infix:<minmax>minmax 演算子
@a minmax @b
戻るRange 最小要素からの@a そして@b 最大要素に。 Range もし文通することであるなら、最小および最大値がそうであったそれらが、それ以外、個々にパスするかのように、インプットの要素が扱われるexcludes 範囲で、設定されているにマークをつけるフラグを除外する同じく返送された(人たち・もの)にセットされるRange.
infix:<X>クロス演算子
1,2 X 3,4 # (1,3), (1,4), (2,3), (2,4)
活気演算子、と対照してX 演算子が、そのリスト引数のそれぞれから1つの要素をとることによって、構成されたすべての可能なリストを返す。 最右要素が最も急速に変化するように、返送されたリストは順序づけられている。
もしただ2つのリスト、例えば、それだけがあるなら1つの要素が、2番目の要素が最も急速に変化するという状態で、第2から最初のリストと他の(の・もの・人)からであるすべてが対にするフォーム。 従ってあなたは言ってもよい:
<a b> X <1 2>
あなたは終われ
('a', '1'), ('a', '2'), ('b', '1'), ('b', '2')
これは平らなコンテキストでフラットなリストになるそしてLoL lol コンテキストで:
say flat(<a b> X <1 2>).perl
'a', '1', 'a', '2', 'b', '1', 'b', '2'
say lol(<a b> X <1 2>).perl
LoL.new( ('a', '1'), ('a', '2'), ('b', '1'), ('b', '2') )
演算子は結合で、そうにリストだ
1,2 X 3,4 X 5,6
生産する
(1,3,5),(1,3,6),(1,4,5),(1,4,6),(2,3,5),(2,3,6),(2,4,5),(2,4,6)
他方、もしリストの何かが空しいなら、あなたは空白リストで終わるだろう。
ただ左端リストだけが有効に無限のリストであるかもしれない。 例えば
<a b> X 0..*
生産するだろう
('a',0), ('a',1), ('a',2), ('a',3), ('a',4), ('a',5), ...
そしてあなたは決して「b」に到着しないだろう。
Cross メタ演算子
@files X~ '.' X~ @extensions 1..10 X* 1..10 @x Xeqv @y etc.
Cross 演算子を見ろ。
infix:<...>連続演算子。
リストとしてインフィックス演算子、... その左と権利両方の上にリストを受けて、そして値の望ましい連続シーンをプロデュースするために可能な限りいい加減にそれらを評価する。 リストはフラットなリストとして評価される。 すべてと同じようにリストインフィックス演算子、この演算子は優先でカンマより緩い、それであなたはそれの両側でのコンマリストを括弧で括る必要があるわけじゃない。
演算子は、 righthand リストの最初の値を得ることによって、始める。
これは権利の唯一の値がそれをリストするということである... 演算子は中に実際に興味を持っている;追加のリスト要素がいい加減に後で返されるために上がって大切な何も... される。
最初の値が左の側面から生成されるはずであるシーケンスの末端あるいは制限であると見なされる righthand ...
演算子自身。
我々がシーケンスの限界を知っている途端に、左のリストは項目によっての評価された品目と普通の数値的だ、あるいは文字列値が(右手に限界によって許された程度に)変化していない状態でパスされる。
もし連続の値がスマートマッチする何、制限値、連続も、それを含めて、終わるなら最終の制限値。 使用最終値を省略すること...^ その代わりにできろ。
内部的に、これらの2つのフォームは匿名のループが終わるだろうかどうか見るために調べている、そしてそこでループはシーケンスの値を返しているものだ。 値がでの次の候補を仮定する$x そして最初の要素が副菜が持っている権利の$limit演算子がそれぞれ実装される2(人・つ) :
... last($x) if $x ~~ $limit; ...^ last if $x ~~ $limit;
これがスマートマッチを使うからとして~~ 演算子(下にマッチしている Smart に会え)、いつものスマートマッチルールは適用される。 もし限界がそうであるなら*連続限界を持たない. もし限界がクロージャであるなら、それは現在の候補に関してブールの真実で評価されるだろう、そして、クロージャが偽に戻る限り、シーケンスは継続するだろう。
もしまさしくその最初の値がマッチするなら、リストされるより少ない値を終わりテストリターンすることは連続にとって非常に可能だ:
my $lim = 0; 1,2,3 ...^ * > $lim # returns Nil, since 1 > 0
もしそれがただ左手にリテラル値を返すことができただけであったなら、この演算子はかなり無用だろう。 力は古いものから新しい値を生成することから来る。 あなたは、例えば、たまたま無限のリストを生産する存在するジェネレーターを使ってもよい:
1..* ... * >= $lim @fib ... * >= $lim
いっそう典型的に、もし左のリストの中の次の項目がそうであるなら、返されたではない;どちらかと言えばそれがへ存在するリストの末端の上に呼び出されるクロージャ、それが新しい値を生産する。 クロージャの arity はいくつの前の値を連続に次の値を生成することにおいてインプットとして使用するべきか決定する。 例えば、ツーによって数えることはただ一つの引数を必要とするだけだ:
2, { $^a + 2 } ... * # 2,4,6,8,10,12,14,16...
フィボナッチ数列を生成することは一度に2つの引数をとる:
1, 1, { $^a + $^b } ... * # 1,1,2,3,5,8,13,21...
Any が、関数がそれを呼び出すよりむしろ、あなたがそれを手配するのと同じぐらい長い間、リスト値として十分に役を果nたすであろうことを明示することについて、意味する:
1, 1, &infix:<+> ... * # 1,1,2,3,5,8... 1, 1, &[+] ... * # same thing 1, 1, *+* ... * # same thing
いっそう典型的には関数は単項だ、そしてその場合左のリストの余分の値がそうであるかもしれない何でもドキュメンテーションを人間が読むことができると解釈した:
0,2,4, { $_ + 2 } ... 42 # all the evens up to 42
0,2,4, *+2 ... 42 # same thing
<a b c>, { .succ } ... * # same as 'a'..*
関数は単調である必要がない:
1, -* ... * # 1, -1, 1, -1, 1, -1... False, &prefix:<!> ... * # False, True, False...
関数は、同様に、0 - ary であり得る、その場合クロージャが最初のものであることは問題がない:
{ rand } ... * # list of random numbers
どのケースかについて、関数は同じく素晴らしい(n値)かもしれないall 前の値はパスされる(どちらがそれらがすべて演算子によってキャッシュされなくちゃならない、それでパフォーマンスが被害を受けるかもしれない、そしてあなたが「スペース漏れ」であなた自身を見いだすかもしれないことを意味するか)。
関数の arity は帰りの値について、しかしもしそれらがマッチするなら数とマッチする必要がない、あなたは無関係な連続に挟んでもよい:
1,1,{ $^a + 1, $^b * 2 }...* # 1,1,2,2,3,4,4,8,5,16,6,32...
この場合それに注意する限界テストが適用される何、区画全体、も2つの値を含んでいる関数から戻った.
演算子が生成した連続が明示的な関数から関数のシグネチャーによって暗示されたそれらの制約以外の連続の上に型制約を置かない。 もし関数のシグネチャーが存在する値とマッチしないなら、連続は終わる。
クロージャを生み出しているない場合が供給される、そして連続は数であって、そして明らかに算数、あるいは(その最後の3つの値を調べることから、)幾何学的だ、適切な関数は推論される:
1, 3, 5 ... * # odd numbers 1, 2, 4 ... * # powers of 2 10,9,8 ... 0 # countdown
すなわち、我々が最後の3数を呼び出すとして$a$bそして$cそしてそれから定義しろ:
$ab = $b - $a; $bc = $c - $b;
もし$ab == $bc そして$ab ではないゼロ、それから我々は関数によって決定される等差数列を推論する*+$ab. もし$ab ゼロだ、そして3つの値は数のように見える、それから関数はそうだ*+0. もしそれらが数のように見えないなら、関数選択済みはいずれかだ*.succ あるいは*.pred 上に依存するかどうか$b cmp $c 増加しているか、あるいは減少しているように思われる。 もしcmp Same を返すそれで識別情報関数が仮定される。
もし$ab != $bc そしてnone($a,$b,$c) == 0それから、類似の計算が幾何数列が正当化されるかどうか決定するために引き算よりむしろ除算を使ってされる。 定義しろ:
$ab = $b / $a; $bc = $c / $b;
もし商が等しい(そして有限)、それで幾何学的な関数である2(人・つ){$_ * $bc} 推論される。
もしこれまでのところリストにたった2つの値があるなら、$a そして$bそして相違$ab
非ゼロは、我々は等差数列を想定するということだ*+$ab. もし$ab
ゼロだ、それから再び、2つの値が数のように我々が使うかどうかを見定めるかどうかについて、それは依存する*+0 あるいは*.succ/ *.pred.
もしたった1つの値があるなら、我々は常に増加を仮定するとして.succ. (これはそうすることを強いられるかもしれない.pred 下の同じぐらい指定された限度の試験によって。) 従ってこれらは同じという結果になる:
1 .. * 1 ... * 1,2 ... * 1,2,3 ... * <1 2 3> ... *
同じく、もし所定の値あるいは値が数じゃないなら、.succ 仮定される、それでこれらは同じという結果になる:
'a' .. * 'a' ... * 'a','b' ... * 'a','b','c' ... * <a b c> ... *
もし左手のリストがそうであるなら()我々が使用であるという状態で、関数{()} 何の無限の供給も生み出さないために。
もし限度がされる、それがそうしなくちゃならないなら、正確にスマートマッチしろ。 もしそれがそうしないなら、無限のリストが結果として生じる。 例えば、「漸近的に近づいてくる」ではないから、あなたが指定したかのように、「同等」と同じもの、次のことの両方ともが無限のリストだ* 限度の間0よりむしろ:
1,1/2,1/4 ... 0 # like 1,1/2,1/4 ... * 1,-1/2,1/4 ... 0 # like 1,-1/2,1/4 ... *
同じく、これは偶数のすべてだ:
my $end = 7; 0,2,4 ... $end
このような状況をとらえるために、それはその代わりに不平等を書くように助言される:
0,2,4 ...^ { $_ > $end }
明示的な制限関数が使われる、それが、何でも返すことによって、そのリストを終えることに決めるかもしれないとき真の値。
この演算子が結合性、内部の関数が後に続かれるかもしれないリストだから... そしてリストを続けるもう1つの関数など。 従って、
1, *+1 ... { $_ == 9 },
10, *+10 ... { $_ == 90 },
100, *+100 ... { $_ == 900 }
生産する
1,2,3,4,5,6,7,8,9, 10,20,30,40,50,60,70,80,90, 100,200,300,400,500,600,700,800,900
クロージャがない時、我々がたださらにそれを書くことができる標準のマッチしているルールという条件のもとで:
1, 2, 3 ... 9, 10, 20, 30 ... 90, 100, 200, 300 ... 900
あるいはちょうどさえ:
1, 2, 3 ... 10, 20, 30 ... 100, 200, 300 ... 900
なぜなら、それがクロージャではなく、適切な型の値であるなら、正確にマッチしている限度が連続の一部として返されるから。
左手にたった1つの値があるとき、推論された関数のために、最終の値は決定に慣れているかどうか*.succ あるいは*.pred いっそう適切だ。 値が比較される2(人・つ)cmp 発展の方向を決定するために。
従って連続演算子は、レンジ演算子と異なり、「自動的に後退して」いる。
'z' .. 'a' # represents a null range 'z' ... 'a' # z y x ... a
数の値で、文字列マッチが正確に違いない、あるいは無限の順序が作り出される(とき・から・につれて・ように)。 使用異なったもっとおしゃれなテストをするために正規表現あるいはクロージャとしてそんなものにスマートマッチする.
それほど連続的に注意しろ
1.0, *+0.2 ... 2.0
中に計算されているRat 算数、そうじゃないNumそれで2.0 正確にマッチして、そして連続を終える。
注意しろ: yada 演算子はただ項が期待されるところ(に・で)だけ識別される。
この演算子はただインフィックスが期待されるところ(に・で)使われるかもしれない。 もしあなたが前にコンマを記入したなら... それは、リストがそのポイントに達するとき、失敗する願望を表現している yada リスト演算子と考えられるだろう:
1..20, ... "I only know up to 20 so far mister"
その終端がたまたま、ユーザーから、一つの符号位置を表す文字列である何でも順序立てて並べる例外が(そのために)作られるスペシャルが文字列よりむしろこのような文字列を文字であると考えること典型的にだろう。 もしあなたが何かを言うなら、好む:
'A' ... 'z' "\xff" ... "\0"
あなたが、普通の(人たち・もの)を使う代わりに、アルファベット順のレンジ以内を振る舞うことに興味を持っていて、そうじゃないと想定される.succ/ .pred 文字列のために、それはそれが増加させるか、あるいは原因となっている符号位置数を減少させる単調関数を使う
'A', { $^prev.ord.succ.chr } ... 'z';
"\xff", { $^prev.ord.pred.chr } ... "\0";
あなたは従来の rangechar レンジの中の秋鮮明度が変えないこの代理、何もの意味、がそれを順序立てて並べることを指摘するだろう:
'a'...'z' '9'...'0'
もし始めとストップ文字列が同じ長さであるなら、これは、キャリーで、すべてのポジションで応用される。
'aa' ... 'zz' # same as 'a' .. 'z' X~ 'a' .. 'z'
従って、 16 ビットにフィットしたすべての8進数を作り出すために、あなたは言うことができる:
'000000' ... '177777'
もしスタート文字列がストップ文字列より短いなら、文字列は右の justitifed だと考えられる、そして、1キャリーがあるとき、左端のスタート文字は複写される:
'0' ... '177777' # same octal sequence, without leading 0's
他の方法で行って、それらが最初の存在する数値に行くとき、数値が、現在の値が最終の値、それから数値がそこ(に・で)残っているのと同じぐらい短くなるまで落とされる。 それはそれを言うおしゃれな方法だ
'177777' ... '000000'
そして
'177777' ... '0'
両方ともは正確に前進的な連続が、ただ後ろ向きに、上にすることをする。
余分の特殊な規則として、もし最低の文字が「0」であり、そしてトップの文字が英数字であるなら、それは両方向に働く、それは10以上の数値が英字によって表されるベース36までいずれかのベースで数を表していると考えられる。 16ビットの数の seme の連続シーンが、ただ16進数で、それと共にプロデュースされるかもしれない Hence :
'0000' ... 'ffff' '0' ... 'ffff' 'ffff' ... '0000' 'ffff' ... '0'
そして制限する訴訟として、これは同じく一つの文字に当てはまる:
'0' .. 'F' # 0..9, 'A'..'F'
場合がレンジのトップの文字から直感で知られるとは、注意しろ。
文字列インクリメントのためにそこ(に・で)多くの異なった可能な意味規則だ。 もしこれらであるならあなたが欲する、あなたが常に書くことができる意味規則はあなた自身の直後の要素関数じゃないか。 時々愚かな符号位置計数はあなたが欲するものだ。 例えば、あなたは主要なギリシャの英字のレンジを罰せられないでやり通すことができる:
'ΑΑΑ' ... 'ΩΩΩ'
しかしながら、もしあなたが小文字でそれを試みるなら、英字、あなたは小文字のシグマの両方のフォームを得るだろう、そしてそれをあなたが proably に欲しない。 もしただ1(人・つ)があるなら、あるいはあなたが欲しない、あなたがそれらの項目の外に grep することができる2通の英字、しかし一般的なケースで、あなたはあなたが興味を持っている何のシーケンスを知っている加算機を必要とする。 多分そこ(に・で)一般的なメソッドであり得る、
'ααα', *.succ-in(@greek) ... 'ωωω'
それは順序を与えられた何でもして、そして文字列でどんなマッチしている文字のためにでもそれを増加の宇宙として使用するだろう。
保護区 Perl にレンジの5つの長さを制限している意味規則が好む'A'..'zzz'あなた必要を持っている何かが好む:
'A', *.succ ... { last if .chars > 3; $_ eq 'zzz' }
(それは Perl 5 が、それ以来、することに正確なマッチじゃないStr.succ Perl 6 に少しもっとおしゃれだ、しかし「A」に始まってそれは同じように機能するだろう。
権限:が常にあなた自身のインクリメント関数を供給する。)
それに注意するlast 内部のテスト呼び出しであるけれども、上の呼び出しが、それほど、引数を返さないlast($x)そうするためのこの呼び出しlast それが(すでに)連続であるかのように一緒に指定されていたバイパス...^ その代わりに。 他の方法で、行く...^ 多分、明示に引数をパスすることによって、最終の値を持っていることを強いられろlast($my-last-value). 同じように、それは引数のない内部を迂回するだろうlast.
類似の方法で、連続は、呼び出すことによって、終えられるかもしれないlast
ジェネレーター関数から:
10,9,8, { $_ - 1 || last } ... * # same as 10 ... 1
正確な値(あるいはそれはもう1つの連続を正確な値で始める)で終わる順序がだと見なされるいつ「たいてい熱烈な」リスト、何かの熱烈な部分を終えるべきか決めることについての目的のために有限であって、何もであるように明示的な最終のクロージャを持っている順序。
しかしながら、終わるどんな連続でも* (もし終わるための内部の論理を持っているクロージャで生み出されるならさえ)不可知の長さの(こと・もの)であると見なされる。 しかしながら、「たいてい熱心である」の定義によって S07 で、実装はこのようなシーケンスが推測の評価によって有限であると決定することが可能であるかもしれない;このような workahead が、もちろん、シーケンスが Very Long Time を運営しないで無限であることを証明することができない。
クロージャと最終の値両方を指定するフォームを使うことによって、同じくそれに注意しろ、有限であるように思われる、しかし、リソースが疲れ切っている前に、決して実際にその最終値に達しないシーケンスを書くことは可能だ; このような連続は有限であるが、最終的に達せられた深い悲しみとして取り扱われるだろう:
@a = 1, *+0.00000000000000000000000000000000000001 ... 2; # heat death
ユーザーが無限であることを知っている、しかしコンピュータが容易にそれを知ることができない、それがそうすることを可能にされるようなシーケンスあるいはリストが一緒にリストの終わりを記録を残す何のためにでも*それはそれが気にかけるコンテキストで無限のリストとして扱われるはずであることを示す。 同様に、何でもそれが解釈する演算子で終わって傾く* 無限が、同じように、そんなものに持って行かれるかもしれないように$n xx *あるいは1..*.
infix:<E>EMPTY イテレータのためのテスト
それらの何でも空だ、そしてその場合それが右手に thunk を実行しない限り、左手にリストを返す。 典型的にループで使wdetake:
loop {
take @iterators>>.get E last;
}
演算子がリストを返すこれらの多くParcels、どのコンテキストに依存することは1つのフラットなリストの中にすべて出たそれらを平らにするかもしれない、あるいはそうしないかもしれない。 デフォルトは下に contextualizers を平らにして、しかし見るはずだ。
infix:<=>リスト割り当て
@array = 1,2,3;
複合的なターゲットで、リスト割り当てを行なう。 右側はリストインフィックスより緩い。 そのトークン名がそうであるとき、あなたは我々がなぜこれを前置演算子として分類したかと思っているかもしれないinfix:<=>. それはあなたが、あなたが言ったかのように、極めて、接頭辞リスト演算のために左側を特別な構文だと見なすことができるからだ:
@array.assign: 1,2,3
しかしながら、それがそれを見るから、 tokener は、それがインフィックス演算子を期待しているときそれをインフィックスとして分類する。 特にもし左手にあるものがある種の宣言詞であるなら、一般的な割り当てが意味はそれらが、何が左手にあるかについて、大いに依存するから、いっそうさかのぼって有効なマクロのように扱われる。 我々はそれらのいくらかを呼び出しさえする、我々が左側がリストあるいはスカラー目的地かどうか理解しなければならない限りにおいて、擬似割り当て、しかしそれらはすべて少し擬似だ。
何ででも、右手に左か、あるいはすでに計算された値の上にスカラー目的地がある限り、場合、リスト割り当てがコピーして、それが基本的に自明のことをする限りにおいて、独断的にいい加減であるために定義される。 しかしながら、多くのリスト左辺値が(割り当てが直接配列に変化したケースだと見なされることができる)配列目的地で終わる。 配列目的地の中にコピーするとき、リスト割り当ては「たいてい熱心だ」;それらが有限であることが知られている限りにおいて、それはその先行するイテレータ(そして値)を評価して、そして次に、周知の値を返して、停止を命ずるためにリストを求める。 割り当てはそれから周知の値を配列にコピーする。 (イテレータ API がどのように定義されることになるかについて、これらの2つのステップは実際に依存してインタリーブされるかもしれない。) リストの残りを配列の残っている値の「仕様」として使うことによって、 self - 拡張していること、要求次第具体化して考えられることはそれから配列を準備する。 従ってそれは言うために正当だ:
@natural = 0..*;
(すぐに停止を命ずるように要求されないで我々がリストコンテキストでのイテレータが停止を命ずると言うとき、それがそうであることに注意を払え。 スケジューラーがイテレータを走らせているとき、もしそれが接近がスループットを増やすだろうと考えるなら、それはバッチで値を前もって計算することに決めるかもしれない。 これは一つのコアのアーキテクチャに関して体重が重い文脈切り替えにとって事実である可能性が高くて、そして、コアがまだコンテキストをしなければならないかもしれないように乗り換えるコア、より多くのイテレータがあるとき、 manycore CPUアーキテクチャに関してさえ事実である可能性が非常に高い。 何でも、抽象的に、たとえそれがまだ完全に計算されなかったとしても、リストが頭がしっかりしているから、場合、これはすべて多かれ少なかれユーザーに明白だ。)
要素が普通の配列のように配列オンデマンド、それら法令の中に具体化して考えられるかもしれないけれども共にユーザーと同じぐらい遠い reification が関係している前と後に要素。 もし原因となっているコンテナ型がそれをサポートするなら、これらの要素は手紙を書かれるかもしれない:
@unnatural = 0..*; @unnatural[42] = "Life, the Universe, and Everything";
割り当てと異なり、バインディングがコンテナを置き換える、それで、レンジオブジェクトが添え字化されることができないから、次のことが失敗することに注意を払え:
@natural := 0..*; # bind a Range object @natural[42] = "Life, the Universe, and Everything"; # FAILS
けれどもこれは成功する:
@unnatural := [0..*]; # bind an Array object @unnatural[42] = "Life, the Universe, and Everything"; # ok
何でも利用することは誤っている、ファイルポインターの動きのような、 reification の副作用が異なった実装から異なったバッチ意味規則を持っているかもしれない、そして何ででも収納ケース、リストの unreifiedな地域、がすでに配列「のものだ」。
self の - 拡張している配列が要素のそのカウントを求められるとき、それは戻ることを可能にされる+Inf もしそれが点検によってその unreifiedな部分が何でも含んでいると決定することができるなら、爆発しないで無限のリスト。
もしそれがこれを決定することができないなら、それはあなたのすべての記憶、そして次に若干数を使うことを可能にされる。 :)
(おそらく)いい加減なハッシュではないへの割り当て。
infix:<:=>実行時バインディング
$signature := $capture
新しい形の割り当てがバインドしている、呼び出された6が typeglob 割り当ての代わりに使った Perl に存在している。 それは行なわれるで:= 演算子。
標準の割り当てのようにコンテナで値を置き換える代わりに、それはそれ自身コンテナを置き換える。 例えば:
my $x = 'Just Another'; my $y := $x; $y = 'Perl Hacker';
これ、両方ともの後に$x そして$y 文字列を含んでいろ"Perl Hacker"、それらから本当にただ同じ変数の2つの異なった名前だ。
そこ(に・で)同じく識別情報テストだ、=:=2つの名前が同じ原因となっている変数にバインドされるか否かにかかわらずどのテストか。 $x =:= $y 上記の例で真に戻るだろう。
もし型が、変数がバインドされることについて、十分に現在の宣言の型と一致しないなら、バインディングは失敗する。 厳密に言えば、変化後に何も
my Any $x; $x := [1,2,3];
失敗するべきであるなぜなら存在が一緒に一貫したではないをバインドした型Scalar of Anyしかしそれ以来Any 型は実数のインスタンス化できる型ではなくて一般的な(非)制約である、そしてScalar of Any まあ言わば二重の非制約の相似はそうするはずだAny我々 typeless 変数に特別にこの状態をバインディングの同等物として取り扱う.
バインディング演算子は割り当てをリストと解析する、それで括弧なしで右手にリストを生成することは合理的だ:
@list := 1 ... *;
infix:<::=>バインドと型読み取り専用
$signature ::= $capture
これは同じことをするけれども:=それからどんな目的地パラメータにでも読み取り専用であるという記録を残す(個別のパラメータがいずれかでこれをオーバーライドしないならrw trait あるいは the copy トレイト). それは特にダイナミックスコープのために読み取り専用 dynamic 変数を確立することに役立つ:
{
my $*OUT ::= open($file, :w) || die $!;
doit(); # runs with redirected stdout
}
doit(); # runs with original stdout
もしdoit 変わることを望む$*OUTそれがそれ自身の動的変数をだと宣言しなくちゃならない. そうすることはただ割り当てないかもしれない$*OUT.
それほど意味規則的に注意すの::= 事実上標準に引数をバインドすることに(同じく読み取り専用をデフォルトとする)正式のサブルーチンパラメータとまったく同じだ。
この演算子は割り当てをリストと解析する。
標準の listops
print push say join split substr open etc.
junctional 演算子のリスト演算フォーム
any all one none
例外ジェネレーター
fail "Division by zero" die System::Error(ENOSPC,"Drive $d seems to be full"); warn "Can't open file: $!"
太くて短い例外ジェネレーター
... !!! "fill this in later, Dave" ??? "oops in $?CLASS"
... 演算子は関数プロトタイプでとりわけ身体として使用される「yada 、 yada 、 yada」リスト演算子だ。
それはひどく不平を言う(呼び出すことによってfail)もしそれが今までに実行されるなら.
変形??? 呼び出しwarnそして!!! 呼び出しdie. 引数はオプションだが、もし提供されているなら、通過するにfailwarnあるいはdie. さもなければシステムは、あなたが揉み消される何かを実行しようとしたことを示して、コンテキストに基づいてあなたのためにメッセージを構成するだろう。 (このメッセージは何からかに関して意見が異なるfailwarnそしてdie ただ不完全なデザインよりむしろデフォルトまでに、後者から演算子が典型的に良くないデータあるいはプログラミングを指摘すると言うだろう。)
演算子を減らせ
[+] [*] [<] [\+] [\*] etc.
下に縮小演算子を見ろ。
ロールへの強制型変換としてのシギル
Sigil Alpha variant ----- ------------- $ Scalar @ Positional (or Iterable?) % Associative & Callable
これらがロールに強制型変換だから、それらが何でも問題のロールをする実際の型リターンするために許されることに注意を払え。
直接スカラーに適用されないなら、変数、同じぐらい中にいる@$aこれらがただとして処理される引数の周り明示的な括弧で応用されるかもしれないそのままParcel 平らになっているリストではなく、オブジェクト:
$(1,2 Z 3,4) # Scalar((1,3),(2,4)) @(1,2 Z 3,4) # ((1,3),(2,4)) %(1,2 Z 3,4) # PairSeq(1 => 3, 2 => 4) $(1,2 X 3,4) # Scalar((1,3),(1,4),(2,3),(2,4)) @(1,2 X 3,4) # ((1,3),(1,4),(2,3),(2,4))
(注意する、括弧が示す内部がネストされるParcel ここで、平らになることはできないときから時組み立てろ。)
それ以来Parcel 透明が、そこ(に・で)意味の間に相違であり得ない引数がである(の・もの・人)で@($a) そして@$a.
item contextualizer
item foo()
Perl 5 ののための新しい名前:scalar contextualizer 。 同等そうすること$(...)
(その空き以外$() 手段$<? 空である間に / / Str ($/) > item() 屈服するFailure).
我々はまだ値スカラーを呼び出して、そして「スカラー演算子」について話をする、しかしスカラー演算子はそれら引数を項目コンテキストに入れた人たちだ。
もし関数が作るリスト、これを与えられるならSeq それからのオブジェクト。 関数は何についてでも不可知論だParcel このような連続と何ででも埋め込みで、文脈上の決定が内容の次の使用まで延期されるだろう。
シーケンスオブジェクトにこれがリストを、あなたが一般に変換するためにそれを必要とするであろうときからの単項の接頭辞演算子ではなく、リスト演算子と解析することに注意を払え。 (一つの項目が項目に変換される必要がない。) しかしながら、それがそのリスト項目を平らにすることをしないとは注意しろ:
@x = lol(item (1,2),(3,4)) # @x eqv LoL( (1,2), (3,4) )
list contextualizer
list foo()
次の展開式にリストコンテキストで評価されることを強いる。 平らになっている Any がいい加減に起きる。
flat contextualizer
flat foo()
次の展開式に平らになっているリストコンテキストで評価されることを強いる。 結果は回帰的に平らになるだろう、すなわち、ではなく埋め込みじゃないを含む段落Parcel オブジェクト。
lol contextualizer
lol foo()
「リストのリスト」コンテキストで次の展開式に評価されることを強いる。 これは典型的に多次元のスライスを形成するために使われる。
潜在的に subparcels を含んでいる区画が、特に、型のリストのリストに変換されるだろうLoL.
hash contextualizer
hash foo()
次の展開式にハッシュコンテキストで評価されることを強いる。
展開式はリストコンテキストで評価される(何でも平らにするParcels) それから、ハッシュがリストから作られて、リストと思われるだろうのPairs.(それがそうであるリストの Any 要素Pair キーであって、そしてその値としてリストで次の値をつかむふりをするだろう。) 同等そうすること%(...) (その空き以外%() 手段%($/)空である間に、hash() 空のハッシュを意味する).
infix:<and>ショートそして
$a and $b and $c ...
偽でそうするそれが評価する最初の引数を返して、さもなければ最後の引数の結果を返す。 コンテキストが偽の帰りに意味することを強いるリストで(). 見ろ&& 上に高い優先の機種のために。
infix:<andthen>成功の上に進む
test1() andthen test2() andthen test3() ...
(もし結果が未定義であるなら、すなわち、)その評価が失敗を示す最初の引数を返す。 さもなければそれは右の引数を評価して、そして返す。
もし右側がブロックあるいは pointy ブロックである、左側の結果が何かに境界であるならブロックの引数。 もし右側がブロックじゃないなら、ブロック範囲が右側と副菜が暗黙のうちに縛られている左の結果の周りに引き受けられる$_ 右側の範囲のために。 すなわち、
test1() andthen test2()
匹敵するものはそうするはずだ
test1() andthen -> $_ { test2() }
対応する高い優先のバージョンがない。
infix:<or>すべてを含んでいるショートあるいは
$a or $b or $c ...
真でそうするそれが評価する最初の引数を返して、さもなければ最後の引数の結果を返す。 コンテキストが偽の帰りに意味することを強いるリストで()あるいはNil. 見ろ|| 上に高い優先の機種のために。
infix:<xor>排他的論理和
$a xor $b xor $c ...
もし1(人・つ)(そしてただ1(人・つ))があるなら、真の引数を返す。 もしすべての引数が偽であるなら、最後の引数を返す。 戻るBool::False
さもなければ(1以上の引数が真であるとき)。 コンテキストが偽の帰りに意味することを強いるリストで(). 見ろ^^ 上に高い優先の機種のために。
infix:<orelse>失敗に関して進む
test1() orelse test2() orelse test3() ...
それが成功裏に(もし結果が定義されるなら、すなわち、)評価する最初の引数を返す。 さもなければ右の引数の結果を返す。
もし右側がブロックあるいは pointy ブロックである、左側の結果が何かに境界であるならブロックの引数。 もし右側がブロックじゃないなら、ブロック範囲が右側と副菜が暗黙のうちに縛られている左の結果の周りに引き受けられる$! 右側の範囲のために。 すなわち、
test1() orelse test2()
匹敵するものはそうするはずだ
test1() orelse -> $! { test2() }
(最高優先// 演算子は類似だが、未設定をする$! あるいは特別にブロックを処理しろ。)
項と同じように、ターミネータは本当は優先レベルではなく、最も緩い優先より緩いレベルだ。 それらがすべてどんな演算子先行パーシングでも終了させて、そして完全な展開式をメインパーサーに戻す効果を持っている。 それら演算子優先順序パーサーが何のステートにあるか気にする. もしパーサーが現在項を期待していて、そして展開式での最終の演算子が nullterm を取り扱うことができないなら、それは構文エラーだ。 (注目すべきことに、コンマ演算子と多くの接頭辞リスト演算子は nullterm を扱うことができる。)
セミコロン:;
$x = 1; $y = 2;
コンテキストはセミコロンによって終えられた展開式がどのように解釈されるか決定する。 文レベルそれらに文がある。 構造それらをかっこでくくることの中でリストとして解釈されのParcellol コンテキストで多次元のスライスの多数の次元として扱われるであろうs。 (他のコンテキストが他の解釈を持っているか、あるいは完全にセミコロンを拒否するかもしれない。)
飼料演算子: < ====> 、 < < ====>>
source() ==> filter() ==> sink()
二重のアングルを持っているフォームは流しのするべきことのリストを激しく打つよりむしろ付加する。 ==>> 形式が常に前方にアペンドするべき適切なターゲットがそうすることを期待する、鎖での最終の流し、あるいは次の(人たち・もの)が明示でステージをフィルターする@(*) あるいは@(**) ターゲット。 これはあなたが多数の供給装置1つのフィルタコマンドに積むことができることを意味する:
source1() ==>> source2() ==>> source3() ==>> filter(@(*)) ==> sink()
類似の意味規則がそうすることを志願する<<== それが後ろ向きにアペンドするべき適切なターゲットがそうすることを期待することを除いて。
制御ブロック: <ws> {・・・}
ブロックがインフィックスが期待される空白文字の後に起こるとき、それは文コントロール構造の間制御ブロックとして interpreated される。 (もし空白文字がないなら、それは添え字だ、そしてもしそれが項が期待されるところであるなら、それはただそのままのクロージャに過ぎない。) もし現在このようなブロックを探している文がない、それがそうであるなら構文エラー。
文修飾子:もし、なら間に、そのときまで、賛成だ
文修飾子が1つの展開式を終了させて、そしてもう1(つ・人)を始める。
意外な Any)]、}このレベルで.
呼び出しは追加の、しかし正しいターミネータを認識するために演算子優先順序パーサーの中にパラメータ化されているかもしれない、何の括弧でもソートする、(アングル以外)で自動的に長さ1つのトークンとしてターミネータのセットに含まれている。 (より長い長さのインフィックスが考えられるところではこれらの文字の1つで始まることができて、そして最も長いトークン規則の下で認識されていて、そして展開式を続けるだろう、しかしこの実践は思いとどまらせられる。 あなたの気味が悪い演算子のために Unicode を使うほうが良いだろう。) それらが超演算子を形成することができるように、角括弧が免除される(超演算子参照)。
ブロック決勝戦}指定期間の末、ライン、が現在の展開式を終える. 1ブロック引数の中で、カンマ演算子によって後に続かれないなら、リストが引数リストを終了させる。
いくつかの演算子が明快さともっと良いハフマンコードを言語増やすために(今まで)所定の新しい名前:だった、他方他の人たちが優先を変えた。
Perl 5 の${...}@{...}%{...}など間接参照フォームが今、だ$(...)@(...)%(...)などその代わりに.
(Perl 5 のカール状のフォームの使用がエラーメッセージがユーザーを新しいフォームに向かわせるという結果になるだろう。)
Perl 5 に、間接参照であるとき、括弧が落とされるかもしれない(とき・から・につれて・ように)スカラー変数。
-> なる.世界の残りのように、使用。 ある擬似postfix:['->'] Perl 5 ユーザーにその代わりにドットを使うよう思い出させているコンパイル時エラーを作り出す演算子。 (「pointy ブロック」、使え-> Perl に、矢印が後置と混同されることができたとき、6が前の空白文字を必要とする、それはインフィックスが期待されるとき、だ。
前の空白文字ではないが項でポジションを必要とした。)
文字列結合. なる~. 一緒にそれを「とじ」、その引数の2つの端、と考えろ。 文字列付加が同じくだ~=.
filetest 演算子はなくなっている。 我々は今使うPair オブジェクトのメソッドを呼び出すパターンとして:
if $filename.IO ~~ :e { say "exists" }
同じであるけれども
if so $filename.IO.e { say "exists" }
同じく
if $filename.IO ~~ :!e { say "doesn't exist" }
同じであるけれども
if not $filename.IO.e { say "doesn't exist" }
第1番目の形式は実際に形を後者に翻訳する、それでオブジェクトのクラスはどれほどディスパッチメソッドにか決める。 それはちょうど起きるそれIO ロールが期待された filetest 意味規則をデフォルトとする、しかし$regex.i あなたに正規表現が、例えば、大文字小文字の違いを無視するかどうか教えるかもしれない。 同じく、あなたは definedness あるいは未定義について何でもテストすることができる:
$obj ~~ :defined $obj ~~ :!defined
パターンを使ってジャンクション:としての合わせて形式、テストがそうであるかもしれない複数
given $handle {
when :r & :w & :x {...}
when :!w | :!x {...}
when * {...}
}
副詞の対が1つの項の中に積み上げられている、それが仮定されたそれらであるときそれほど、一緒に、 AND をとられる
when :r :w :x
いずれかと等しの :
when :r & :w & :x when all(:r,:w,:x)
メソッドの値が Bool として評価されるから、ペアフォームはブールのテストにだけ役立つ、それでメソッドフォームはどんな数値的ベースのテストのためにでも使われなくちゃならない:
if stat($filename).s > 1024 {...}
しかしながら、これらはまだ働く:
given $fh {
when :s {...} # file has size > 0
when :!s {...} # file size == 0
}
それが(それより)もっときつい優先を必要とする場所で使われることができるメソッド形式の利点がである(の・もの・人)~~ 供給する
sort { $^a.M <=> $^b.M }, @files».IO
あなたがただ書くことができたときから、それが愚かな例であるけれども:
sort { .M }, @files».IO
けれどもそれはメソッド形式の他の利点を示す、そしてそれはそれがテストに「単項のドット」構文に現在のトピックを許すということだ。
Perl 6 の旧バージョンの場合と異なり、これらの filetest メソッドはただちに型のバッファーじゃなくて、単純なスカラーを返すBoolIntあるいはNum.
一般に、ファイル名が照会されるとき、ユーザーは統計値バッファーをキャッシュすることについて頭を悩ます必要がない。 もし同じオブジェクトが最近質問されたなら、バッファーが自動的に再利用されるだろうという統計値、「最近」が1秒かそこらより少しと定義されるところ。 もしこれが関心、 () あるいは lstat () が明示を返すために使われるかもしれないという明示的な統計値であるならIO
タイムアウトを受けやすくないだろう、そしてそうであるかもしれないオブジェクトが繰り返してただファイル名としてテストをした、あるいは容器を扱え。 IO オブジェクトがそうした.file (もし知られているなら)、そのファイル名について参照されることができるメソッド。
(Perl 5 フォームの不注意な使用が通常否定された postdeclaredなサブルーチンとして取り扱いをもたらすだろう、そしてそれはエラーメッセージ指定期間の末コンパイルを作り出す可能性が高い。)
同じく1つのドットで始まる項目ではなくするすべての後置演算子はそれがする代わりの形式を持っている。 (ただあなたが書くことができるからといって、逆は持ちこたえないx().foo あなたが書くことができることを意味しないx()foo. 同じく言う能力$x.'foo' それを暗示しない$x'foo' 働くだろう。)
演算子の後置解釈は呼び出し、どちらが接頭辞を呼び出すかがその代わりに組織する引用されたメソッドの使用によってオーバーライドされるかもしれない。
それでx().! 常に後置演算子だ、ただx().'!' 常に電話をするだろう!x(). 特に、あなたはものが好むと言うことができる$array.'@'. これは同じく何でも含む、見るであろう演算子が特別な意味で何かが好きだ、もしメソッドを呼び出すドットの後に使われた。 例えば、あなたが定義したもしprefix:<=>そして必要とされたあなた使ってそれを書くこと - が代わりに構文を呼び出すメソッド=$objectパーサー付くだろう$object.= 突然変異として構文(「メソッドを突然変異させている」 S12 参照)。
執筆$object.'=' あなたの接頭辞演算子を呼び出すだろう。
Unary ~ 今文字列を課す(Stringy)その引数、の上のコンテキストそして+ 数値的を押し付ける(Numeric)コンテキスト(Perl 5 で無操作命令であることと対照した場合). 同じラインに沿って、? ブールを押し付ける(Bool)コンテキスト、そして| 単項の演算子が - 引数1つの関数を課す(Parcel あるいはCapture)その引数の上のコンテキスト.
通り過ぎて後に続かれるとき、 Unary シギルが許される$ スカラー変数;それらの上のシギルがそれらシギルによって暗示されたコンテナコンテキストを課す。
しかしながら、 Perl 5 と同じように、$$foo[bar] として解析をする( $($foo) )[bar]それであなた必要$($foo[bar]) 他の方法を意味するために。 言い換えれば、シギルが本当に演算子と解析されない、そしてあなたは複雑な何のためにでも挿入句の形式を使わなくちゃならない。
ビットワイズ演算子がデータ型接頭辞を受けとる:+~あるいは?. 例えば、 Perl 5 の| いずれかになる+| あるいは~| あるいは?|オペランドが数、文字列、あるいはブールの値として取り扱われるはずかどうかについて、依存する。 Perl 5 の左シフト << なる +< そして相応して右シフトで。 Perl 5 は単項だ~
(1の補数)がいずれかになる+^ あるいは~^ あるいは?^ビットワイズ NOT が固体のものに対して排他的論理和のようだから。 それに注意しろ?^ 機能上同一であるそうすること!けれども、概念的にブールの最初そして次にフリップにビットを強制する。 どうか使ってくれ! その代わりに。 割り当て演算子で、説明されるように演算子がそれを追うことによってのその対応する代入演算子に変えられることができるビットワイズ=. 例えば Perl 5 の <<= なる +<= .
?| ただ OR が違う論理名だ|| それで?| 常に両側を評価して、そして標準的なブールの値を返す。 すなわち、そうすることは同等だ?$a + ?$b != 0. もう1つの相違がそれが加算演算子の優先を持っているということだ。
?& ただ AND が違う論理名だ&& それで?& 常に両側を評価して、そして標準的なブールの値を返す。 すなわち、そうすることは同等だ?$a * ?$b != 0. もう1つの相違がそれが乗除演算子の優先を持っているということだ。
ビットワイズ文字列演算子(それら皮切り~)ただ申し込まれるかもしれないbuf 型あるいは相似が整数配列を圧縮して、そして記憶のチャンク全体を一つの莫大な整数として扱う。 それらが異なるから+ それの演算子+ 演算子が文字列を最初に文字列が数の ASCIIの表示であったという仮定についての数に変換しようとするだろう。
x 2つの演算子の中への分裂:x (どちらが一つの文字列を生産するための文字列の反復を連結するか)、そしてxx (それはリストあるいは項目の反復のリストを作る)。 "foo" xx * リストを初期化することに役立つ任意の部数を表す。 左側のxx ただ1度だけ評価される。 (繰り返して、使用ブロックを呼び出すためにmap
その代わりに。)
? : 演算子がなる条件付き?? !!. 擬似演算子、infix:<?>キャッチが移住性であるという状態で、コンパイル時間における brainos 。
qw{ ... } 同義語を受けとる:< ... >そして補間変形、«...». まだ Unicode の祝福なしで生活している人たちのために、それは同じく書かれることができる:<< ... >>.
コンマ, 今構造Parcel その演算数からのオブジェクト。 これが変わる項目コンテキストでSeq オブジェクト。 使うべき権限:[*-1] 添え字が最後の1(人・つ)を手に入れる。
(注意する*. Negative 添え字がもう暗黙的に終わりから数えない;実際、もしあなたが使うなら、コンパイラは不平を言うかもしれない[-1] コンパイル時間に否定的な添え字を持たないことを知られたオブジェクトに。)
本当は演算子、しかし特別な名詞が組織する単項のバックスラッシュ演算子ではない。
それはその引数あるいは引数を「取り込んで」、そしてそれらの引数を表しているオブジェクトを返す。 権限:が引数の異なった部分を検索するいくつかの方法でこのオブジェクトをデリファレンスする;鮮明度を見ろCapture S02 で詳細のために。 (それがその代わりに「unspace」、すなわち、空白文字あるいはコメントのエスケープされたシーケンスを始めるであろうから、空白文字がバックスラッシュの後に許されない。 詳細のために S02 を見ろ。
しかしながら、十分奇妙なことに、言っているその unspace 規則のために\\ $foo
等しくあろうとする\$foo.)
古いもの.. 演算子が今一緒にされるフリップフロップff 演算子。 (.. 常に今生産するRange 項目コンテキストでさえオブジェクト。) ff 演算子が始まることあるいは終わることを除外するためにどちらかの側のキャレットを必要とするかもしれない。 同じく文通することがあるfff Perl 5 のを持っている演算子... 意味規則。
あなたは言ってもよい
/foo/ ff *
決して失敗ではなくがかつてひっくり返したフリップフロップを示すために。
すべての比較演算子は同じ優先レベルで統一される。 下に連鎖式比較を見ろ。
リスト割り当て演算子は今右手に何のようにも他のリスト演算子を解析する、あなたが右手に括弧を必要としないように、一方に加担しろ:
@foo = 1, 2, 3;
あなたはまだ左手のそれらを賛成であるという状態で必要とする
($a, $b, $c) = 1, 2, 3;
割り当てから演算子は左にカンマよりもっときつい。
「気にかけない」ポジションが assigment によって示されるかもしれない to the * トークン。
決勝戦* リストの残りをスローする:
($a, *, $c) = 1, 2, 3; # throw away the 2 ($a, $b, $c, *) = 1..42; # throw away 4..42
(シグネチャー構文、の中でそのまま$ 同様に、一つの引数を無視することができるそしてそのまま*@ 残っている引数を無視することができる。)
リスト割り当てが順番に左手に右手にそれぞれのコンテナにリストを提供する、そしてそれぞれのコンテナがリストの前部から1つ以上の要素をとるかもしれない。 もし要素が去った何かがあるなら、左の後方一致の上にリストじゃないなら、警告が表示される* あるいは右手のイテレータが定義される最終試験*. 従ってこれらのいずれも警告しない:
($a, $b, $c, *) = 1..9999999; ($a, $b, $c) = 1..*; ($a, $b, $c) = 1 xx *; ($a, $b, $c) = 1, 2, *;
これは、しかしながら、情報損失についてあなたに警告する:
($a, $b, $c) = 1, 2, 3, 4;
Perl 5 のように、配列あるいはハッシュへの割り当てがすべての残っている値を音を立てて飲んで、そして決してこのような警告を作り出すことができない。 (それは、しかしながら、ただ Perl 5 のように、要素なしで、何にでも次の左辺値コンテナを残すだろう。)
左側は何の前にでも完全にコンテナのその連続のために評価される、割り当てがされる。 そのためにこれ:
my $a = 0; my @b; ($a, @b[$a]) = 1, 2;
@ b[1]ではなく、 @ b[0]に2を割り当てる。
項目割り当て演算子は、それほど、カンマよりもっときつい優先で一つの展開式を期待する
loop ($a = 1, $b = 2; ; $a++, $b++) {...}
Cプログラマーが期待するであろうように、働く。 右手の項の= 常に項目コンテキストで評価される。
項目とリスト割り当ての間の構文的な特質は Perl 5 がそれを定義する方法に類似している、しかし、我々がもう外のシギルをベースにして内部の添え字の性質を決定することができないから、少し異なっていなければならない。 それでその代わりに、項目割り当てが単純な左辺値に制限される、他の何へのスカラー変数と割り当てでもリスト割り当てと解析される。 次のフォームは「単純な左辺値」と解析される、そしてスカラーコンテナに項目割り当てを暗示する:
$a = 1 # scalar variable $foo::bar = 1 # scalar package variable $(ANY) = 1 # scalar dereference (including $$a) $::(ANY) = 1 # symbolic scalar dereference $foo::(ANY) = 1 # symbolic scalar dereference
これらが同じく項目割り当てであるように、左辺値が宣言子、型とトレイト、で飾られるかもしれないほどスカラー変数:
my $fido = 1 my Dog $fido = 1 my Dog $fido is trained is vicious = 1
しかしながら、(括弧と添え字化された展開式を含めて)それよりいっそう複雑な何でもその代わりにリスト割り当てとしてパージングを強制する。 同じく1つの単純なスカラーコンテナではないが割り当てをリストと解析して強制する何への割り当ても。 リスト割り当てがコンマ優先より緩い展開式を期待する。 右側は常にリストコンテキストで評価される:
($x) = 1,2,3 $x[1] = 1,2,3 @$array = 1,2,3 my ($x, $y) = 1,2,3 our %map = :a<1>, :b<2>
リスト割り当てのルールは、それほどすべて、割り当てを巻き込むことを応用する$x 上に、捨てられた値のために警告を作り出せ。 もし実行時警告が避けられないことは感じ取られるなら、警告がコンパイル時間に表示されるかもしれない。
= デフォルトでシグネチャーの中の宣言は本当に割り当ていない、そして常に項目割り当てと解析される。 (すなわち、リストにあなたが括弧を隠すために使わなくちゃならないデフォルト値として何でも割り当てるために、リスト値でのコンマ。)
スカラー値にリストを割り当てるために、あなたは言うことができない:
$a = 1, 2, 3;
あなたが言ったかのように、2と3が流し(空虚さ)コンテキストにあると見られるであろうから:
($a = 1), 2, 3;
その代わりに、あなたは明示的に項目割り当て解釈を停止させるか、あるいはくつがえすために何かをしなくちゃならない:
$a = [1, 2, 3]; # force construction (probably best practice) $a = (1, 2, 3); # force grouping as syntactic item $a = list 1, 2, 3; # force grouping using listop precedence $a = @(1, 2, 3); # same thing @$a = 1, 2, 3; # force list assignment $a[] = 1, 2, 3; # same thing
もし関数が文脈上神経過敏で、そしてあなたがスカラー値を返すことを望むなら、あなたは使わなくちゃならないitem (あるいは$ あるいは+ あるいは~)もしあなたが添え字あるいは右側のために項目コンテキストを強制することを望むなら:
@a[foo()] = bar(); # foo() and bar() called in list context
@a[item foo()] = item bar(); # foo() and bar() called in item context
@a[$(foo())] = $(bar()); # same thing
@a[+foo()] = +bar(); # foo() and bar() called in numeric context
%a{~foo()} = ~bar(); # foo() and bar() called in string context
けれども最初の書式がまだ素晴らしいもしを働かせることに注意を払えfoo() そしてbar()
コンテキスト重要じゃない関数を項目 - 返している。
一般に、これはすべてちょうどユーザーがほとんどいつも期待することをするだろう。 時間項目あるいはリスト振る舞いの残りが最小の構文で強制されることができる。
リスト演算子がすべて首尾一貫して解析される。 Perl 5 のように、左にリスト演算子が項のように見える、他方右にそれはカンマより緩い演算子のように見える。 Perl 5 に、リスト演算子形態と関数形態の間の差が首尾一貫して示されると異なりリスト演算子と最初の引数の間に空白文字としてうか。 もし空白文字があるなら、それは常にリスト演算子だ、そして次のトークンはリストの第1項として(あるいはもし展開式ターミネータとして、項がないなら)とられるだろう。 項が期待されるところ(に・で)起こっている Any インフィックス演算子が項と誤解されるだろう:
say + 2; # means say(+2);
もし空白文字がないなら、次のパージングが次の項目の構文カテゴリの上に依存する。 括弧(ドットの有無にかかわらず)がその代わりにリスト演算子を関数呼び出しに変える、そしてすべての関数の引数は括弧の中に(それらが優先のルールによって何か他の演算子に付随しないであろうなら、括弧の後に続くかもしれない後置副詞以外)パスするに違いない。
括弧以外に、たとえ引数がないとしても、他のすべての後置がリスト演算子のすぐ後に拒否される。 引数のないリスト演算子に後置を加えるために、あなたは空の括弧でそれを関数呼び出しとして書かなくちゃならない:
foo.[] # ILLEGAL foo.() # ILLEGAL foo++ # ILLEGAL foo().[] # legal foo()++ # legal (if foo() is rw)
何でも後接続する括弧の後に演算子が許される、そして関数呼び出しの結果に適用される。 (同じく後置制限が適用されるけれども、結局演算子をリストするに過ぎないことに注意を払え;それはメソッドに当てはまらない。 それは言うために正当だ
$foo.bar<a b c>
平均に
$foo.bar().{'a','b','c'}
なぜなら、括弧あるいはコロンによって後に続かれないなら、メソッドが決して引数があると想定しないから。)
もしリスト演算子の後の次の項目がインフィックス演算子あるいは項であるなら、構文エラーが報告される。 [推測:これは厳しくないモードでリラックスしているかもしれない。]
例:
say foo + 1; say(foo(+1));
say foo $x; say(foo($x));
say foo$x; ILLEGAL, need space or parens
say foo+1; ILLEGAL, need space or parens
say foo++; ILLEGAL, need parens
say foo($bar+1),$baz say(foo($bar+1), $baz);
say foo.($bar+1),$baz ILLEGAL, need space or parens
say foo ($bar+1),$baz say(foo($bar+1, $baz));
say foo .($bar+1),$baz say(foo($_.($bar+1), $baz));
say foo[$bar+1],$baz ILLEGAL, need foo()[]
say foo.[$bar+1],$baz ILLEGAL, need foo().[]
say foo [$bar+1],$baz say(foo([$bar+1], $baz));
say foo .[$bar+1],$baz say(foo($_.[$bar+1], $baz));
say foo{$bar+1},$baz ILLEGAL, need foo(){}
say foo.{$bar+1},$baz ILLEGAL, need foo().{}
say foo {$bar+1},$baz say(foo({$bar+1}, $baz));
say foo .{$bar+1},$baz say(foo($_.{$bar+1}, $baz));
say foo<$bar+1>,$baz ILLEGAL, need foo()<>
say foo.<$bar+1>,$baz ILLEGAL, need foo().<>
say foo <$bar+1>,$baz say(foo(<$bar+1>, $baz));
say foo .<$bar+1>,$baz say(foo($_.<$bar+1>, $baz));
Perl 6 が項対後尾辞と、それに対して挿入辞の間に一貫した三者の特質にしていて、そして多く積み過ぎた文字を解釈するであろう重要性< それに応じて:
any <a b c> any('a','b','c') # term
any()<a b c> (any).{'a','b','c'} # postfix
any() < $x (any) < $x # infix
any<a b c> ILLEGAL # stealth postfix
これは不慣れに思われるだろう、そしてそうな Perl 5 プログラマーへの「undwimmy」が文法にそれほどだらしなく少数が演算子に後接続するハードワイヤ、拡張性の価格、を使った。 Perl 6 は後置演算子についてその代わりに完全に拡張可能なクラスを増すために空白文字依存を義務化することに決める。
リスト演算子の引数は同じくではないがコンマあるいはコロンまでに後に続いたクロージャによって終えられる。 (そして、もしクロージャがラインで最終のことであるなら、セミコロンが暗黙だ。 「unspace」をそれを隠すために使え。) この最終のクロージャは後尾辞によって後に続かれるかもしれない、そしてその場合後置は全部のリスト演算子の結果に適用される。
空のシグネチャーで前もって宣言された関数がランタイムにおいての0 - ary だと見なされる、しかしまだリスト前置演算子と解析される、そして次の引数リストを探す、そしてそれをそれがランタイムに拒絶するかもしれない。
my sub foo () {...}
foo; # okay
foo(); # okay
foo (),(),(); # okay
foo 1; # fails to dispatch
コンパイラはそれがランタイムに成功することができないことを知っている何についてでも不平を言うことを可能にされる。 それに注意する多、しかしながら:そのシグネチャーの1つとして () を含むかもしれない
my multi foo () {...}
my multi foo ($x) {...}
foo; # okay
foo(); # okay
foo (),(),(); # okay
foo 1; # okay
単純な項と解析される項目を申告するために、あなたは形式を使わなくちゃならないterm:<foo>あるいは何か他の形の列挙型宣言のような不変の宣言。 このような項は決してその引数を探して、決してリスト前置演算子だと見なされない、そして、それが意図的な項の代わりに関数呼び出しと解析されるであろうから、次の括弧と共に働かないかもしれない。 (問題の関数は存在するかもしれない、あるいはそうしないかもしれない。) 例えば、rand Perl 6 に単純な項であって、そして、ノーがあるから、括弧を許さないrand() 関数(そこ(に・で)けれども$n.rand メソッド). 定数がそんなものを高く評価する大部分の人たちe そしてpi 同じカテゴリーにある。 これらの1つを解析した後で、パーサーは見るために後置を期待する、あるいは、項ではなく、インフィックス演算子。
そのために、リスト演算子が、エラーがパーサーが続けて2つの項を見たことを示すという状態で、失敗するように定められている(とき・から・につれて・ように)、何でも単純な値を使おうと試みる。
なぜなら返答する(型のような)それらの値が括弧へだ(すなわち、それはするCallable ロール)、(後置演算子と解析される)括弧オブジェクトを呼び出すために:順調であることを必要とされる
my $i = Int.($x); # okay my $i = Int($x); # okay my $i = Int $x; # ILLEGAL, two terms in a row
正確に1の arity で前もって宣言された非多 sub が同じくまだ多数の引数を期待している演算子をリスト接頭辞と解析する。 あなたは明示的に形式を使わなくちゃならないprefix:<foo> 宣言するためにfoo as a 優先で単項で名前をつけられて;それはまだ一つの定位置パラメタを要さなくちゃならない(何でもけれども、多くの名指されたパラメータが許される、それは副詞に境界であり得る).
引数と一緒の他のすべての sub が演算子をリストと解析する。
&& そして|| 演算子はリストコンテキストについてもっと頭が良くて、そして戻る() 失敗に関して中によりむしろコンテキストをリストしろBool::False. 演算子はまだショートする、しかしもしいずれかの演算子がそうするであろうなら、偽の値、それがそうである帰りが変換した、から偽の結果が self - デリートしているようにリストコンテキストでの空白リスト。 (もしこの self を削除する振る舞いではないが望んだなら、コンテキストをリストするよりむしろ展開式を項目コンテキストに入れろ。) - 削除が、それほど同様、リストコンテキストのブールの値の一般的なプロパティではなく、演算子自身の振る舞いであるこの self :
@foo = so($a||$b); @foo = not($a||$b);
保証されているから正確に1つのブールの値を挿入しろ@foo.
|&そして^ もうビットワイズ演算子じゃない(Perl 5 演算子に対する変更を見る)しかし今ずっとより高い原因をサポートしろ:それらは今ジャンクションコンストラクタだ。
ジャンクションは多数の値に同等の一つの値だ。 もう1つの結果を表しているジャンクションを返している演算を通してのそれらスレッド:
(1|2|3) + 4; # 5|6|7 (1|2) + (3&4); # (4|5) & (5|6)
最後の例によって例証されるように、2つのジャンクションが一つの演算子を通して応用されるとき、結果は値のそれぞれの可能な組み合わせへの演算子の適用を表すジャンクションだ。
ジャンクションが機能的な変形を持って来るanyalloneそしてnone.
これは建築物が好きである賛成のドアを開ける:
unless $roll == any(1..6) { print "Invalid roll" }
if $roll == 1|2|3 { print "Low roll" }
ジャンクションが添え字化することを通して働く:
doit() if @foo[any(1,2,3)]
ジャンクションは特に整然としていない。 それでもしあなたが言うなら
foo() | bar() | baz() == 42
それはコンパイラに junctional 引数の間にカプリングがないことを示す。 それらが中に評価されることができる、何でも命令する、あるいは並列に。 それらの何でも42を返すとすぐに、それらがショートして、そしてまったく他の人たちを動かすことができない。 あるいはもし並列に走っているなら、最初の成功したスレッドは突然に他のスレッドを終了させるかもしれない。 一般にあなたはおそらくジャンクションで副作用でコードを避けることを望む。
ジャンクションと一緒の否定的な演算子の使用は、もし素朴に自動的に通されるなら潜在的に問題だ。 しかしながら、定義することによって!= そしてne 否定メタ演算子に関して、我々は自動的に英語を話す人によって期待される「育成ではなく」得る。 すなわち、
if $a != 1 | 2 | 3 {...}
本当は手段
if $a ![==] 1 | 2 | 3 {...}
それを何かに似ている高次関数へのメタ演算子書き換えが好きだ:
negate((* == *), $a, (1|2|3));
それは同等の値:であることになる
if not $a == 1 | 2 | 3 {...}
それは英語を話す人が期待する意味規則だ。 しかしながら、それは後者があなた自身を構成すると書くためにもっと良いスタイルだろう。
配列の上の Junctive メソッド、リストとセットが対応するリスト演算子とまったく同じように働く。 しかしながら、ハッシュの上の junctive メソッドがただハッシュのキーだけのジャンクションを作る。 リスト演算形式を使え(あるいは明示.pairs)ペアのジャンクションを作ること.
それら優先が統一されるから、それらが鎖でつながれることができること以外、 Perl 5 の比較演算子は基本的に変化していない。
2進=== テストの不変の型と値連絡:2つの値型(すなわち、不変の型)のために、テストはそれらか否かにかかわらず同じ値だ(eg . 1 === 1);2つの変更可能な型(オブジェクト型)のために、それらが同じ識別情報値を持っているかどうか調べる.
(たいていのそのような型のために識別情報はただ参照だけ自身だ。)
それは真じゃないそれ[1,2] === [1,2] それらが異なっているからArray オブジェクト、しかしそれは真であるそれ@a === @a それらが同じであるからArray オブジェクト).
Any オブジェクト型が定義することによって値型であるふりをするかもしれない.WHICH
使って回帰的に比較されることができる値型を返すメソッド===あるいはそれが、多重定義によって、実際的じゃないケースで=== 比較が首尾一貫して(彼・それ)らの「永遠の」識別情報で値を処理するように。 (文字列が、同じくオブジェクトであったにもかかわらず、このように値と定義される。)
それらがまったく同じ型の(こと・もの)じゃないなら、2つの値が決して同等じゃない。 それと対照して、eq 常に文字列への強制型変換、他方== 常に数値的への強制型変換。 実際、$a eq $b 本当は手段「~$a === ~$b」そして$a == $b
手段+$a === +$b.
同じく、文字列によって調律された間に、ハッシュが使うことに注意を払えeq ハッシュが使うオブジェクトによって調律されたデフォルトによっての意味規則=== 意味規則と一般的な値によって調律されたハッシュが使うeqv 意味規則。
2進eqv テスト平等が極めて好む=== 「永遠である」よりむしろそれほど「スナップショット」意味規則と一緒の意味規則をして、しかしする。 不変の型の(こと・もの)であるあなたの値のトップレベルのコンポーネントのために、eqv
振る舞いで同一であるそうすること===. しかしながら、匹敵するよりむしろ変更可能なあなたの値のコンポーネントのためにオブジェクト識別情報使用方法===eqv 演算子が、もし我々がちょうど今それらのスナップショットをとって、そして使っているそれらの(今不変の)スナップショットを比較したなら、両方の subvalues の正準表現が同一であるであろうかどうか試す===.
もしそれが同じくあるほど、十分の柔軟性じゃないならeqv() 存在することができる関数がパスした、あなたが規準的な値がどのようであることを望むか明示している補足情報が前に比較を生み出した。 これは寄贈するeqv() ソートシグネチャーと同じまあ言わば表現力に豊んだ力。
(そして本当に、cmp Perl 5 からの演算子が同じく機能的なアナログ、を持っているcmp()それどのようにソートアルゴリズムが必要とする種類の3方向比較をするべきかについて、追加の指示をする。)
特に、シグネチャーがパスするという状態で、そうするためにeqv() 問題の2つのオペランドにバインドされるだろう、そして次に比較は、情報に含まれる項目、シグネチャー、によれば、仮パラメータの上に進むだろう、それであなたは数値的、文字列、パラメータの型とトレイトの適切な宣言との自然か、あるいは他の比較を強制することができる。 もしシグネチャーが演算数とマッチしないなら、eqv()
水準に逆戻りするeqv 比較。 (同じく賛成だcmp().)
2進cmp もう文字列化を強制する比較演算子じゃない。 使用leg 古いもののための演算子 Perl 5cmp 意味規則。 cmp ただ同種のものであるeqv 上にそれ以外、戻る代わりにBool::False あるいはBool::True それが常に返す値Order::IncreaseOrder::SameあるいはOrder::Decrease
(それは、-1に、0、あるいは+1を数値化する)。
leg 演算子(さらに少なくより、等しいか、あるいはより大きいより)定義されることに関してcmpそれで$a leg $b 今定義されたけれども~$a cmp ~$b. 演算子がまだデフォルトとする種類cmp よりむしろleg.<=> 演算子の意味規則はそれが戻ること以外変化していないOrder 上記のように値。 言い換えれば、$a <=> $b
今匹敵するものはそうするはずだ+$a cmp +$b.
ブールの比較演算子のために非 - が強制的であるという状態でcmp
意味規則、ノーブランドを使えbefore そしてafter 演算子を挿入しろ。
普通の2項演算子としてこれらは否定されるかもしれない(!before そして!after)減少しているのと同じぐらいよく([before] そして[after]).
インフィックスmin そしてmax それら引数の1(人・つ)あるいは他を選択するために使われるかもしれない。 リスト演算フォームを減らす[min] そして[max] 存在するように、同じく利用可能であるmin= そしてmax= 割り当て演算子。
デフォルトまでにmin そしてmax 使用cmp 意味規則。 すべてと同じようにcmpベースの演算子、これは副詞を指定している異なった意味規則によって修正されるかもしれない.
他のほとんどの演算子のように、もしその引数のいずれかが未定義であるなら、比較が当然失敗を返す、そしてスローされない例外に関する一般的なポリシーが、あなたが例外を実数の値として使用しようとするとすぐに、例外がスローされるということであることに注意を払え。 しかしながら、種々の parallelizable コンテキストよう超(あるいはソートのような他の「大量生産」コンテキスト)それらをスローするよりむしろスローされない例外を通してパスするだろう.
.. 演算子が一緒に変形を持っているレンジ^ どちらかの端にレンジからその末端の排除を示すために。 それは常に生産するRange オブジェクト。 レンジオブジェクトが不変だ、そして主にマッチしている間隔の間使われる。 1..2 末端を含んだ1から2までの間隔は、1^...^2が末端を除外するが、何かとマッチするのに対して、中間の実数値か。
レンジが、それほど、より広い型に強制する異なった型の、数の引数のために:
1 .. 1.5
平均に導かれる:
1.0 .. 1.5
これらの強制型変換は多シグネチャーによって定義される。 (他の型が異なった強要ポリシーを持っているかもしれない。) 使うことは特に非合法であるRange 末端として:
0 ..^ 10 # 0 .. 9 0 .. ^10 # ERROR
レンジの間他の非数値的で右手の型、右の引数は左の引数の型に強制されて、そして数であるとして扱われる。 従って、Array もし左の引数が数であるなら、2番目の引数での型が数値的だと意図されると考えられる:
0 ..^ @x # okay 0 ..^ +@x # same thing
Whatever 型が -Inf / +Inf を表すために同じくサポートされる。 もしいずれかの末端がそうであるならWhateverCodeレンジもう1つの中にカリー化されたWhateverCode.
他の型のために、レンジは何のためにでも落ち着いているかもしれない、同じ型の2つの引数、もし型がそれ自身それをサポートする。 すなわち、一般に、infix:<..>:(::T Any $x, T $y) このようなそれ、もしがタイプする確定だT 一般的な比較を明確にする(すなわち、定義することによってinfix:<cmp> あるいは匹敵するもの)、レンジその型で作成される.
もしT 同じく定義する.succそれから、レンジは反復されるかもしれない。
(さもなければレンジはただ間隔として使用されるかもしれなくて、そしてもし求められるなら失敗を返すだろうRangeIter.) それが必要じゃないとは、注意しろ、から型のレンジ多方法を定義しろT、一般的なルーチンから通常、あなたのためにレンジを自動的に生み出すことができる。
オブジェクトがサポートするレンジ.min そして.max (彼・それ)らの左と右の引数を表しているメソッド。 .bounds メソッドが間隔を表している2要素のリストとして両方の値を返す。 レンジが自動的に後退していない:2..1 常に空のレンジだ。 (連続演算子... しかしながら、自動的に後退することができる。 下を見ろ。)
オブジェクトがサポートするレンジ.excludes_min そして.excludes_max 除外を表しているメソッド(持っている^)あるいは包含物(いいえ^)範囲でのそれぞれの末端の.
Range | .min | .max | .excludes_min | .excludes_max -----------+------+------+-------------+------------ 1..10 | 1 | 10 | Bool::False | Bool::False 2.7..^9.3 | 2.7 | 9.3 | Bool::False | Bool::True 'a'^..'z' | 'a' | 'z' | Bool::True | Bool::False 1^..^10 | 1 | 10 | Bool::True | Bool::True
もし、リストコンテキストで、使われるならRange オブジェクトが分にびくっとして、そして最大限で終了して値のシーケンスを作り出すイテレータを返す。
いずれかの末端が使って除外されるかもしれない^. 従って1..2 生産する(1,2) ただ1^..^2 匹敵するものはそうするはずだ2..1 そして値(Nil)を生産しない。
下方に重要である連続を指定するために、逆転を使え:
reverse 1..2 reverse 'a'..'z'
代わる代わる、数の連続のために、あなたはレンジ演算子の代わりに連続演算子を使うことができる:
100,99,98 ... 0 100, *-1 ... 0 # same thing
言い換えれば、何もRange リストが想定するように、使われる.succ 意味規則、決して.pred 意味規則。 もしあなたがインクリメントに望むなら、他のどのようなインクリメントも許されない、1、あなた以外の若干の数によっての数の連続が使わなくちゃならない... 演算子を順序立てて並べろ。 (Range 演算子の:by 副詞がここにけなされる。)
0, *+0.1 ... 100 # 0, 0.1, 0.2, 0.3 ... 100
ARange ただもし質問サポートでの型であるなら、反復されるかもしれない.succ メソッド。
もしそれがそうしないなら、何でも Return 失敗を反復しようと試みる。
反対のマッチしている Smart Range オブジェクトが中に(強要によって、もし必要なら)比較をするReal もしいずれかの末端がそうするならドメインReal. さもなければ比較は入っているStringy もしいずれかの引数がそうするならドメインStringy. さもなければ、もしそれが順序を定義するなら、分の型は使われる、あるいはもしそうでなければ、最大限は型だ。 もし分と最大限のいずれも秩序を持たないなら、 .ACCEPTS へのディスパッチが失敗する。 もし問題の順序が注文の選ばれたドメインによって暗示された appropropriate 型の中にスマートマッチされてずっとオブジェクトを強制するために何も持っていないなら、それは同じく失敗するかもしれない。
一般に、比較のドメインは、もし可能であるなら、問題のすべての値を表すことができる型であるべきだ。 従って、 Int ではないからこのような型、それは実数に昇進させられる、それでわずかな数が整数レンジとの比較の前に取り除かれない。 その代わりに整数は実数の上のポイント番号ラインを表すと考えられる:
1.5 ~~ 1^..^2 # true, equivalent to 1 < 1.5 < 2 2.1 ~~ 1..2 # false, equivalent to 1 <= 2.1 <= 2
もし* レンジについて(S02 で「Whatever」型を見ろ)正しい方に起こる、左オペランドから推定されるように、それはレンジが経営しているどんな typespace ででも「肯定的な無限」を意味するためにとられる。
A* 左手に右オペランドから推定されるように、さもなければ否定的な値と typespace で最初の値をサポートする型の間「負の無限数」を意味する。 (ではないが許した両側の上の星)
0..* # 0 .. +Inf 'a'..* # 'a' le $_ *..0 # -Inf .. 0 *..* # Illegal v1.2.3 .. * # Any version higher than 1.2.3. May .. * # May through December
空のレンジが反復されることができない;それは戻るNil その代わりに。 空のレンジがまだ確定を持っている.min そして.maxしかし次のことの1つ真の:1である. .min より大きい項目.max. 2。 .min が.max そして少なくとも1つ.excludes_min あるいは.excludes_max 真だ。
3.両方とも.excludes_min そして.excludes_max 真であるそして.min そして.max
連続した値だ。
反復されるレンジが演算子を対応する連続に変える、そして従って用途が連続の終わりを決定するために意味規則にスマートマッチする。
単項の(人たち・もの)^ 演算子がレンジを生み出すから0 上りそうすること(しかし含まない)その引数. それで^4 賛成で短い0..^4.
for ^4 { say $_ } # 0, 1, 2, 3
もし応用であるなら、型名に、それは、その代わりに、そうにメタクラスの例を示す^Moose 賛成で短いHOW(Moose) あるいはMoose.HOW. それは抽象的な種類の方法でまだまあ「このもののドメインであるところ」を意味する。
[このセクションは推測であって、そして6.0で無視されるかもしれない。]
なぜなら使えRange コンテキストが通常そうである品目のオブジェクトは途方もない , a Range スカラー演算子の間オペランドとして使用されたオブジェクトが一般にその終端に演算子を配ろうと試みて、そして修正されてふさわしくもう1つを返すだろうRange その代わりに、2つの項目のジャンクションとほとんど同じように、ただ適切な間隔意味規則で。 (これの顕著な例外がインクルードを自動的に通すinfix:<~~>スマートなマッチング、をするそしてprefix:<+>
それはレンジの長さを返す。) そのためにもしあなたが末端の代わりに長さを使ってスライスを書くことを望むなら、あなたは言うことができる
@foo[ start() + ^$len ]
それは賛成で短い:
@foo[ start() + (0..^$len) ]
どちらが何かと等しいかが好む:
@foo[ list do { my $tmp = start(); $tmp ..^ $tmp+$len } ]
言い換えれば、数の、そして他の順序づけられた型の演算子は上に思慮がある何かをするために一般に多く積み過ぎているRange オブジェクト。
Perl 6 は、多数のオペランドを許して、比較演算子に自然な延長をサポートする:
if 1 < $a < 100 { say "Good, you picked a number *between* 1 and 100." }
if 3 < $roll <= 6 { print "High roll" }
if 1 <= $roll1 == $roll2 <= 6 { print "Doubles!" }
もし最初の比較が失敗するなら、比較の連鎖が決裂する:
1 > 2 > die("this is never reached");
鎖でのそれぞれの引数がせいぜい1度評価するだろう:
1 > $x++ > 2 # $x increments exactly once
注意しろ:始まっているどんな演算子でもで< それの前(に・で)空白文字を持たなくちゃならない、あるいはそれはその代わりにハッシュ添え字として解釈されるだろう。
スタンダード Perl 6 (すなわち、あなたのコンパイル単位のスタートで有効な Perl の方言)のためにここにスマートなマッチのテーブルがある。 マッチしている Smart は一般に、現在の「トピック」に関して終わっている、すなわち、上に$_. 下のテーブルで、$_ 左側を表sno~~ 演算子、あるいはそうするための引数givenあるいは他のいかなる topicalizer にでも。 X 右の(人たち・もの)が一方に加担する上に対抗させられるべきパターンを表す~~あるいは後でwhen. (そして、実際、~~ 小さい topicalizer としての仕事;すなわち、それがバインドする演算子$_ 左側の値に右側の評価のために。 基礎をなしている(人たち・もの)を使え.ACCEPTS この topicalization を避けるためにできろ。)
最初のセクションはそれらの参加チームの1つとしての恵まれている構文;マッチがされることができるかどうか含んでいる、それはそうだろう。 これらの特別なシンタクスはそれら型よりむしろそれら形式によってディスパッチされる。 さもなければテーブルの残りが使われる、そしてマッチは標準のメソッドディスパッチルールに従ってディスパッチされるだろう。 オプティマイザは追加のマッチ演算子が定義されたコンパイル時間を求めている、そうもしじゃないと想定することを許される、型が明白なパターンは時間をコンパイルする、分岐表は最適化されることができる。 しかしながら、テーブルのこの部分の構文はまだいくぶん恵まれている、限りにおいて~~ 演算子は多数のディスパッチを使わない Perl に少数の演算子の1つだ。
その代わりに、型ベースの苦悩が単独でそうするための属している原因となっているメソッドまでのディスパッチとマッチするX パターンオブジェクト。
言い換えれば、スマートなマッチがパターンの形式あるいは型をベースにして最初にディスパッチされる(X 下に)、そして次にパターン自身がトピックの型に注意を払うべきかどうか、そしてもしそうであれば、どのようにか決めること($_). それで下の2番目のコラムは本当に主要なコラムだ。
Any 最初のコラムの中の参加者があるいはトピックの型のことを気にかけない、あるいは、いっそう特定の型がそれの上に傾いたから、その参加者をデフォルトとして選ぶパターンがマッチしなかったことを示す。
$_ X Type of Match Implied Match if (given $_)
====== ===== ===================== ===================
Any True ~~ True (parsewarn)
Any False ~~ False match (parsewarn)
Any * block signature match block successfully binds to |$_
Any Callable:($) item sub truth X($_)
Any Callable:() simple closure truth X() (ignoring $_)
Any Bool simple truth X
Any Numeric numeric equality +$_ == X
Any Stringy string equality ~$_ eq X
Any Whatever always matches True
Any Nil is nil $_ === Nil
Hash Pair test hash mapping $_{X.key} ~~ X.value
Any Pair test object attribute ?."{X.key}" === ?X.value (e.g. filetests)
Set Set identical sets $_ === X
Hash Set hash keys same set $_.keys === X
Any Set force set comparison Set($_) === X
Array Array arrays are comparable $_ «===» X (dwims * wildcards!)
Set Array array equiv to set $_ === Set(X)
Any Array lists are comparable @$_ «===» X
Hash Hash hash keys same set $_.keys === X.keys
Set Hash hash keys same set $_ === X.keys
Array Hash hash slice existence X.{any @$_}:exists
Regex Hash hash key grep any(X.keys).match($_)
Cool Hash hash entry existence X.{$_}:exists
Any Hash hash slice existence X.{any @$_}:exists
Str Regex string pattern match .match(X)
Hash Regex hash key "boolean grep" .any.match(X)
Array Regex array "boolean grep" .any.match(X)
Any Regex pattern match .match(X)
Any Match identity $_
Num Range in numeric range X.min <= $_ <= X.max (mod ^'s)
Str Range in string range X.min le $_ le X.max (mod ^'s)
Any Range in generic range [!after] X.min,$_,X.max (etc.)
Any Type type membership $_.does(X)
Signature Signature sig compatibility $_ is a subset of X ???
Callable Signature sig compatibility $_.sig is a subset of X ???
Capture Signature parameters bindable $_ could bind to X (doesn't!)
Any Signature parameters bindable |$_ could bind to X (doesn't!)
Signature Capture parameters bindable X could bind to $_
Any Any scalars are identical $_ === X
最終的な統治は、他のどのようなパターン型もXを主張しない場合に限り、適用される。
すべては型にスマートマッチする;共に、「項目別に分類される」~~ そしてgiven/ when
それら引数と自動装填に項目コンテキストに junctive がそれほどそれほど終局の(人たち・もの)的なディスパッチとマッチする何でも提供しろ.ACCEPTS 決して「複数形の」何も見ない。 それで両方とも$_ そしてX 上に潜在的にスカラーとして扱われるコンテナ・オブジェクトだ。 (あなたは hyperize するかもしれない~~ けれども明示的に。 この場合すべてのスマートマッチが型ベースのディスパッチをそうするために使い終わっている.ACCEPTSテーブルの前部における形式ベースのディスパッチじゃない。)
原因となっている型ベースのメソッドディスパッチの正確な形態はそうだ:
X.ACCEPTS($_)
これが型にだけ注意を払う一つのディスパッチ呼び出しとしてX 初めに。 ACCEPTS 接合点が定義されるメソッドPattern ロール。 構成している Any クラスPattern ロールがシングルを供給することに決めるかもしれないACCEPTS 一緒にたった1つの項目を持っているそれらのパターン型に対応するすべてを扱うべきメソッドAny 左手に上に。 あるいはクラスは複数を提供することに決めるかもしれないACCEPTS クラスとこれらがそれから型の上にクラス・ベースの中で再び破るであろう中の多メソッド$_.
テーブルにスマートマッチする主にコンパイル時間に識別されるフォームと型を反映するように意図される. 項目の爆発を避けるために、テーブルは次の型が同様に振る舞うであろうと想定する:
Actual type Use entries for =========== =============== Iterator Seq Array KeySet KeyBag KeyHash Hash named values created with Class, Enum, or Role, or generic type binding Type Char Cat Str Int UInt etc. Num Match Capture Byte Str or Int Buf Str or Array of Int
(しかしながら、これらのマッピングが適切な(人たち・もの)の明示的な定義によってオーバーライドされることができるとは注意しろACCEPTS メソッド。
もし再定義がスマートなマッチの分析のコンパイル時間に前に起こるなら、情報は同じくオプティマイザにとって入手可能だ。)
ABuf ASCIIのレンジの外のバイトあるいは整数が静かに促進するかもしれない何でも含んでいる型をそうすることStr もし Unicode とのその関係が明らかに宣言されるか、あるいはタイプされる場合に限り、そしてその場合には必ず、マッチしているパターンのためにタイプだ。
この型情報はインプットファイルハンドルから来るかもしれない、あるいはBuf ロールはあなたに種々の周知のエンコーディングと一緒にバッファーのインスタンスを作ることを許すパラメータを伴う型であるかもしれない。 このようなタイピング情報がないので、あなたはまだバッファーに対してマッチしてパターンをしてもよい、しかし(離れて最も低く7ビットが ASCII を表すと想定することから)、何でもおごろうと試みる、シーケンス以外に整数としてのバッファーは誤っている、そして警告が気前良く表示されるかもしれない。
反対のマッチングGrammar 文法としてではなく、 typename として文法を扱う。 あなたは使う必要がある.parse あるいは.parsefile
メソッドが文法を行使する。
反対のマッチングSignature 実際に変数をバインドしない、しかしシグネチャーがバインドすることができたかどうか見る唯一のテスト。 本当に、シグネチャーに、使用をバインドすること* バインディングを委任するべきパターンwhen
その代わりに文のがブロックする。 反対のマッチング* それが次のブロックがトピックに対してバインドされるか否かにかかわらずその真実をとるそれでのスペシャルだ、それであなたはマッチして順序づけられたシグネチャーをすることができる:
given $capture {
when * -> Int $a, Str $b { ... }
when * -> Str $a, Int $b { ... }
when * -> $a, $b { ... }
when * { ... }
}
多数のディスパッチの整然としていない意味規則がコードの「序列」を定義するには不十分であるとき、これは有用であり得る。 あなたがそのままのブロックあるいは pointy ブロックにバインドすることができる注目。 バインディングがそのままのブロックに好都合にトピックを残しておく$_上記の最終形式が同等であるようにそうすることdefault. (もちろんそれら型がそのように指定されることができないけれども、プレースホルダーパラメータは同じくそのままのブロック形式で使われるかもしれない。)
賛成のパターンマッチング確定がないAny パターン、もしあなたが欠けることについての状況にあなた自身を見いだすならそうだ反転させるテストにスマートマッチすでAny 右手に、あなたはほとんど常にそれを明示的な呼び出しまでに基礎をなしている(人たち・もの)に渡すことができるACCEPTS $_ をパターンとして使用しているメソッド。
例:
$_ X Type of Match Wanted What to use on the right ====== === ==================== ======================== Callable Any item sub truth .ACCEPTS(X) or .(X) Range Any in range .ACCEPTS(X) Type Any type membership .ACCEPTS(X) or .does(X) Regex Any pattern match .ACCEPTS(X) etc.
あなたが $_ にドットを打たれたメソッドから始める限り、類似のトリックがあなたが合成のオブジェクトのためにデフォルトのマッチしているルールを曲げることを可能にするだろう:
given $somethingordered {
when .values.'[<=]' { say "increasing" }
when .values.'[>=]' { say "decreasing" }
}
切羽詰まればあなたは「いつ反転させられる」をするためにマクロを定義することができる:
my macro statement_control:<ACCEPTS> () { "when .ACCEPTS: " }
given $pattern {
ACCEPTS $a { ... }
ACCEPTS $b { ... }
ACCEPTS $c { ... }
}
ただ行動が容易にそうであるかもしれないけなされた - がスマートマッチする種々の提案された - (そして我々は、いっそう読めるように、希望する)、次のように:模倣された
$_ X Type of Match Wanted What to use on the right
====== === ==================== ========================
Array Num array element truth .[X]
Array Num array contains number *,X,*
Array Str array contains string *,X,*
Array Seq array begins with seq X,*
Array Seq array contains seq *,X,*
Array Seq array ends with seq *,X
Hash Str hash element truth .{X}
Hash Str hash key existence .{X}:exists
Hash Num hash element truth .{X}
Hash Num hash key existence .{X}:exists
Buf Int buffer contains int .match(X)
Str Char string contains char .match(X)
Str Str string contains string .match(X)
Array Scalar array contains item .any === X
Str Array array contains string X.any
Num Array array contains number X.any
Scalar Array array contains object X.any
Hash Array hash slice exists .{X.all}:exists .{X.any}:exists
Set Set subset relation .{X.all}:exists
Set Hash subset relation .{X.all}:exists
Any Set subset relation .Set.{X.all}:exists
Any Hash subset relation .Set.{X.all}:exists
Any Set superset relation X.{.all}:exists
Any Hash superset relation X.{.all}:exists
Any Set sets intersect .{X.any}:exists
Set Array subset relation X,* # (conjectured)
Array Regex match array as string .Cat.match(X) cat(@$_).match(X)
(それに注意する.cat method そして the Cat 両方ともがそれと異なり、一つのオブジェクト、をとる型強要cat リスト演算子として、構文的なリスト(あるいは多重リスト)を受けて、そしてそれを平らにする関数。 しかしながら、これらのすべてが猫オブジェクトを返す。)
ブールの展開式は、比較のような、ブールの値あるいは単項の(人たち・もの)を返すことが知られているそれらだ? 演算子。 それらがそうするかもしれない参照$_
明示的に、あるいは暗黙のうちに。 もしそれらであるならそうする参照$_ 同じく、問題がないすべてで - このような場合あなたは elsifs の文字列にただスイッチ構造をいっそう読み取り可能な代替物として使用しているだけだ。 しかしながら、これがあなたが書くことができないことを意味するとは注意しろ:
given $boolean {
when True {...}
when False {...}
}
それが常に選択するであろうからTrue ケース。 その代わりに条件付きのコンテキストとほぼ同じ使用が内部的に使う:
given $boolean {
when .Bool == 1 {...}
when .Bool == 0 {...}
}
もっと良くて、ただ使用if 文。 何ででも場合、あなたがスマートマッチしようとするもしで~~ あるいはwhenそれ認知するだろうTrue あるいはFalse 統語論上、そしてあなたにそれがあなたが期待することをしないであろうことを警告しろ。 コンパイラは同じく何についてでもテストではなくする他のブールの構造に警告することを可能にされる$_それがそれを発見することができる限りにおいて。
類似の静脈、何にでも、作用しろ(そんなものけれどもgrep)付くMatcher 型の引数を受け入れないだろうBool、それからほとんど常にプログラミングエラーを示す。 (1人は常に使うかもしれない* もしそれがあなたが本当に欲するものであるなら、何とでもマッチするために。 あるいは不変のブールの値を返すクロージャを使え。)
同じくマッチしている正規表現が戻らないことを注意するBoolしかしただMatch 論理値として使用されることができるオブジェクト。 明示を使え? あるいはtrue 勢力にBool もし望ましいなら値。
主要な使用の~~ 演算子がブールの値をブールのコンテキストで返すはずだ。 しかしながら、正規表現のようなある特定のオペランドのために、項目あるいはリストコンテキストの中の演算子の使用がコンテキストをそのオペランドに転送する、それで、例えば、正規表現が、 Perl 5 のように、マッチされたサブストリングのリストを返すことができる。 これは、リストコンテキストでリストを返すことができる、あるいはブールを返すことができるオブジェクトをブールのコンテキストで返すことによって、される。 マッチしているケース正規表現でMatch オブジェクトが種類であるのCaptureそれはこれらの能力を持っている。
スマートマッチ、すべての目的でSet そしてBag 値が型の(こと・もの)であると見なされるKeyHashすなわち、Hash キーがユニークなオブジェクトと値を表すコンテナがそれらのユニークキーの複製カウントを表す。 (明らかに , a Set ユニークさの保証のためにたった0あるいは1つの複製を持つことができる).
Cat 型があなたに非常に拡張可能な文字列を持っていることを許す。
権限:が、それに餌をやることによって、配列あるいはイテレータとマッチするそうすることCat本質的にであるStr ある種のイテレータにわたって相互に作用しろ。
それからRegex それが普通の文字列であるかのように、それに対して使用されることができる。 Regex 機関が文字列にそれがもっと多くの文字を持っているかどうか尋ねることができる、そして、もしその原因となっているイテレータから可能であるなら、文字列はそれ自身を拡張するだろう。 (それほどもしあなたが使うなら、このような文字列が文字の不明確な数を持っているとは、注意しろ.* あなたのパターンで、あるいはもしあなたが文字列にそれがその中にいくつの文字を持っているか尋ねるなら、あるいはもしあなたが文字列全体を印刷しさえするなら、それは迅速であるかもしれない、あるいはそうしないかもしれない文字列の残りで音をたてて飲むように強制されて手触りであるかもしれない。)
cat 演算子が(潜在的にいい加減な)リストを受けて、そして戻るCat オブジェクト。 文字列コンテキストでこれはいい加減に文字列にその要素のそれぞれを強制して、そして不確定な長さについて文字列として作用する。
あなたはこのようなギャザーを捜索することができる:
my $lazystr := cat gather for @foo { take .bar }
$lazystr ~~ /pattern/;
Cat 接合点が一緒に要素の境界とマッチするべき正規表現を許す<,> アサーション、そしてStrPos マッチによって返されたオブジェクトがそのリスト要素の中で要素指数とポジションに分解されることができる。 もし基礎資料構造であるなら変更可能な配列だ、配列に対する変更(通り過ぎてのようにshift あるいはpop)通り過ぎて無限軌道であるCat 要素番号が正しいままでいるように。 文字列、配列、リスト、連続、キャプチャとツリーノードはすべてもっと、あるいはより低度に交換可能に正規表現によってあるいはシグネチャーによって一致されたパターンであり得る。
付加する: Perl 6 メソッド呼び出しのために間接的なオブジェクトの構文を使うとき、インボカントに記録を残す。 次の2つの文は同等だ:
$hacker.feed('Pizza and cola');
feed $hacker: 'Pizza and cola';
コロンが同じく上に使われるかもしれない、普通のメソッドがそれを呼び出して、から示す、それはリスト演算子と解析されるべきだ:
$hacker.feed: 'Pizza and cola';
このコロンは別個のトークンだ。 副詞を前接続しているコロンは別個のトークンじゃない。 そのために、最も長いトークンの規則の下で、
$hacker.feed:xxx('Pizza and cola');
その「演算子に先行する toplevel」としてメソッドに当てはまっている副詞として tokenized される:
$hacker.feed :xxx('Pizza and cola');
.feed の引数リストでの xxx sub としてではなく:
$hacker.feed: xxx('Pizza and cola'); # wrong
もしあなたが順に両方ともに副詞を与えるコロンの意味と若干の位置の引数両方を欲するなら、あなたは2度コロンを置かなければならない:
$hacker.feed: :xxx('Pizza and cola'), 1,2,3;
(類似の理由でラベルのコロンの後に空白文字を置くことは必要とされる。)
副詞の優先のために特にそれに注意しろ:
1 + $hacker.feed :xxx('Pizza and cola');
適用されるだろう:xxx そうするための副詞+ メソッド呼び出しではなく、演算子。
成功する可能性が高いこのではない。
新しい演算子==> そして<== UNIX パイプに類似だが、リストを受け入れて、そして返す関数あるいは文と共に働く。
これらのリストが液体ではなく、不連続のオブジェクトで構成されているから、我々はパイプよりむしろこれらの飼料演算子を呼び出す。 例えば、
@result = map { floor($^x / 2) },
grep { /^ \d+ $/ },
@data;
同じく今右への放送で書かれることができるけれども:
@data ==> grep { /^ \d+ $/ }
==> map { floor($^x / 2) }
==> @result;
あるいは左方の放送でけれども :
@result <== map { floor($^x / 2) }
<== grep { /^ \d+ $/ }
<== @data;
あるいは形式がいっそう明らかにデータの流れを示す。 これらの2つの演算子についての(- 以下しか明白じゃない)詳細のさらに多くのために S06 を見ろ。
6の演算子がその人と共に、ストリングとして、数そしてブールの演算子を前接続して通り過ぎて首尾一貫して、例えば、大いに規則化された Perl +~ そして? それぞれ数、文字列、あるいは一つのビットにビットワイズ演算がされるかどうかを示すために。
けれどもそれはただネーミング規定とあなたが新しいビットワイズを加えることを望んだかどうかだ¬ 演算子は、あなたは加えなければならないだろう+¬~¬そして?¬
あなた自身演算子。 同様に、レンジに末端を排除するキャレットは協定のみによってそこにある。
それと対照して、所定の存在する演算子をいっそう強力だ(あるいは少なくとも異なって強力な)関連した演算子に変えることに対して、 Perl 6 は8つのスタンダードメタ演算子を持っている。 これらは、ビルトインからと同様、 Perl が自動的にユーザー定義の演算子からこれらの新しい演算子を生成するという点で、単なるネーミング規定とは違う。 実際、あなたは一般に個別の metaoperations を定義すると思われない - それら意味規則はベース演算子の変換によって自明であるはずだ。 言い換えれば、これらのメタ演算子は高次関数(他の関数を引数であると思う関数)のために本当にただ速記に過ぎない。
メタ演算子を含んでいる構造は、それらコンポーネントがそうであるけれども、(それによって)我々がそのそれらを意味する熟考された「metatokens」が普通の最も長いトークンのマッチしているルールの適用を受けないということだ。 しかしながら、普通のトークンのように、 metatokens がそれら下位部分の間に空白文字を許さない。
割り当て演算子はすでにCと Perl プログラマーによく知られている。 (けれども.= 演算子が今左手にオブジェクトの上に突然変異しているメソッドを呼び出すつもりである、そして~= 文字列連結だ。) 2項演算子が接尾辞によっての(彼・それ)らの対応する代入演算子に変えられるかもしれないたいていの非関係=. 限界は実際に左側がいつもの連絡によって共に右辺値と左辺値として作用することができるかどうかに基づいている:
A op= B; A = A op B;
終わっている存在するフォームが入っている= このメタ演算子で修正されないかもしれない。
ベース演算子の優先、何の優先にでもかかわらず割り当て演算子が普通の割り当てのそれと同じであることを強いられる。 もしベース演算子がカンマよりもっときついなら、展開式は項目割り当てと解析される。 もしベース演算子が同じであるか、あるいはカンマよりゆるく、展開式がリスト割り当てと解析されるなら:
$a += 1, $b += 2 # two separate item assignments @foo ,= 1,2,3 # same as push(@foo,1,2,3) @foo Z= 1,2,3 # same as @foo = @foo Z 1,2,3
ベース演算子がそうしないなら、リストへの metaassignment が自動的に割り当てられたリストに右の引数を散布しないとは、注意しろ(同じぐらい中にZ 上記の事例). 従ってもしあなたが言うことを望むなら:
($a,$b,$c) += 1; # ILLEGAL
あなたはその代わりに超演算子を使う(下を見る)ければならな:
($a,$b,$c) »+=» 1; # add one to each of three variables
もしあなたが(未定義である)型オブジェクトを含んでいて割り当て演算子をコンテナに適用するなら、あなたがアキュムレータ変数に何らかの種類の観念的な「縮小」を実装していると想定される。 それを目指して、演算は型オブジェクトが autovivifies に演算子のに値を識別する対応する縮小演算子に関して定義される。 それでもしあなたが言うなら:
$x -= 1;
そうすることは多かれ少なかれ同等だ:
$x = [-]() unless defined $x; # 0 for [-]() $x = $x - 1;
そして、期待されるように、 $x がその中に-1を持つことになる。
従ってあなたは正確に書いてもよい:
my Num $prod;
for @factors -> $f {
$prod *= $f;
}
これがスカラ変数のケースでかろうじて有用に思われるかもしれない間に、修正された場所がほんの少し前に autovivification によって引き起こされたかもしれないとき、それがこのように機能することはずっと重要だ。 言い換えれば、もしあなたが書くなら:
%prod{$key} *= $f
あなたはハッシュ要素がまだ存在するかどうか心配する必要がない。 もしそれがそうしない、それが簡単にそうするであろうなら、の値で初期化されろ$f.
Any インフィックス関係演算子が型を返すBool プレフィックス変換によってそのネガに変換されるかもしれなで!. 2つのこれらが伝統的な近道を持っている:
Full form Shortcut --------- -------- !== != !eq ne
けれどもそれらの大部分がそうしない:
!~~ !< !>= !ge !=== !eqv !=:=
視覚の混乱を避けることで!! 演算子は、あなたはすでに演算子を修正してはならない!.
演算子がそうである否定された何の優先でもベース演算子と同じもの。
あなたはただ戻るそれらの演算子だけを否定するかもしれないBool. それほど論理的な演算子的に注意するよう|| そして^^ 戻るBoolしかしどちらかと言えば演算数の1つ。
インフィックス演算子がそれと一緒プレフィックス変換によって反転させられたその2つの引数で呼び出されるかもしれない Any R. 例えば、反転させられた比較をするために:
Rcmp Rleg R<=>
何の優先でも後退した、演算子はベース演算子と同じだ。 結合性ではないが、それほど、反転させられる
[R-] 1,2,3 # produces 2 from 3 - (2 - 1)
他の影響を表明すること減量する、反位、リスト:
[-] reverse 1,2,3 # produces 0
Unicode 文字» (\x[BB])そして« (\x[AB])そして(彼・それ)らの ASCII 2字表現>> そして<< そのリスト(あるいは配列)のそれぞれの要素に引数(あるいは引数)を操作して、そして結果の一つのリスト(あるいは配列)を返す「リスト操作」を意味するために使われる。 言い換えれば、超演算子が項目コンテキストでその引数を評価するが、リストとしてそれからそれらに演算子を散布する。
ハイパー演算子を書くとき、スペースが、すなわち、何の間にも、内側に入ることを許されない「ハイパー」それが修正しているマーカーと演算子. 間隔ポリシーの外の曜日で指定はベース演算子と同じだ。 同じくそのベース演算子として超演算子が同じようにそうである何もの優先。 これはあなたがたいていの演算子のためにあなたのコンマリストを括弧で括らなくちゃならないことを意味する。 例:
-« (1,2,3); # (-1, -2, -3) (1,1,2,3,5) »+« (1,2,3,5,8); # (2,3,5,8,13)
単項のハイパー演算子(いずれかの接頭辞あるいは後尾辞)がその引数サイドに位置しているたった1本のハイパーマーカーを持っている、他方インフィックス演算子が2つの引数があることを示すために常に両側で1(人・つ)を持っている。 Unary 演算子が常にリストあるいは(彼・それ)らの一つの引数とまったく同じ状態の配列を生産する。 インフィックス演算子が2つのリストあるいは同一の状態の配列を与えられるとき、その同じ状態の結果が産み出される。 さもなければ結果は、あなたがどのように超マーカーを書くかについて、依存する。
インフィックス演算子、いずれかの引数が不十分に大きさを計測されるかどうかのために、 Perl はそれを「アップグレードする」、しかしただもしあなたがそれに超マーカーの「鮮明な」終端を向けるなら。
(3,8,2,9,3,8) >>->> 1; # (2,7,1,8,2,7) @array »+=» 42; # add 42 to each element
実際、引き上げられたスカラーが整然としていない型にそんなものをもたらすであろう唯一のことである as a Bag:
Bag(3,8,2,9,3,8) >>->> 1; # Bag(2,7,1,8,2,7) === Bag(1,2,2,7,7,8)
言い換えれば、引数に小さい終端を向けることはそちら側で「dwim」に超演算子に教える。 もしあなたが両側の上に片側あるいは他が過小に大きさを計測されるだろう、あなたが dwim することができるかどうか知らないなら:
$left «*» $right
[注意しろ:もしあなたがこのような何かによって混乱させられて Perl のことが心配であるなら:
func «*»
それからあなたはそれのことで心配するべきじゃない、なぜなら前バージョンと異なり、 Perl 6 は決して次のものが項あるいは演算子かどうか言い当てないから。
この場合それは常に項を期待していないならfunc 型あるいは値名であるために前もって宣言される。]
アップグレードは決して「率直な」終わりで起きないの超. もしあなたが書くなら
$bigger «*« $smaller $smaller »*» $bigger
例外がスローされる、そしてもしあなたが書くなら
$foo »*« $bar
あなたは形が同一であることを必要としている、あるいは例外がスローされるだろう。
すべての超 dwimminess のために、もしスカラーが向こう側がリストを期待するところ(に・で)見いだされるなら、スカラーは1つのリストであると見なされる、要素が繰り返した* 時。
我々がプロセスに2つのリストを持っている途端に、我々はどのように要素を連絡に入れるべきか決めなければならない。 もし両側がその通りにやるなら、最終候補者リストは要素の適切な番号を作るために必要であるのと同じぐらい多くの時間が繰り返されるようにするだろう。
もしたった1つの側がその通りにやるなら、そちら側の上のリストはただその通りにやらない側にリストをはめるために栽培されるか、あるいは切り落とされるだろう。
dwim が配列の形から強制されているか、あるいは新興かどうかにかかわらず、 dwim するという側が選択された途端に、その通りにやる側の上の dwim 意味規則は常に存在する:
(@dwimmyside xx *).batch(@otherside.elems)
これは他の側に対応する次元と同じ長さリストを作成する。 扱うべき次元がもっとある場合に備えて、オリジナルの演算子はそれから回帰的にそれぞれの対応する1対の要素に適用される。
ここに若干の例がある:
(1,2,3,4) »+« (1,2) # always error (1,2,3,4) «+» (1,2) # 2,4,4,6 rhs dwims to 1,2,1,2 (1,2,3) «+» (1,2) # 2,4,4 rhs dwims to 1,2,1 (1,2,3,4) «+« (1,2) # 2,4 lhs dwims to 1,2 (1,2,3,4) »+» (1,2) # 2,4,4,6 rhs dwims to 1,2,1,2 (1,2,3) »+» (1,2) # 2,4,4 rhs dwims to 1,2,1 (1,2,3) »+» 1 # 2,3,4 rhs dwims to 1,1,1
それを見るもう1方法は必要に応じて多くとしてあるいはほとんど要素として生産しないようにその通りにやるリストの要素が索引作成済み法であるとはその要素の数だ。
その通りにやるリストのそれぞれの要素が今度はもし必要ならもう1つの次元の中に拡大されるかもしれない、それであなたが、例えば、その次元数にかかわらずマトリックスのすべての要素に1(人・つ)を加えることができることに注意を払え:
@fancy »+=» 1
その通りにやらない側、何でもどのようにするべきか知らないスカラー値Iterable OR素子のリストとして取り扱われるだろう、そして2項演算子のために他の側に同等のOR素子リストによって一致されなくちゃならない。 すなわち、ハイパー演算子が保証されている、からそのすべての引数が非リストの引数である対応するスカラー演算に変化している。
単項演算子を使って、 dwimmery が今までに起きないから、あなたが常に一つの演算数に率直な終わりを向けるとき:
@negatives = -« @positives;
@positions»++; # Increment all positions
@positions.»++; # Same thing, dot form
@positions».++; # Same thing, dot form
@positions.».++; # Same thing, dot form
@positions\ .»\ .++; # Same thing, unspace form
@objects.».run();
("f","oo","bar").>>.chars; # (1,2,3)
メソッド呼び出しが本当に演算子、が挿入しない、それであなたが示すべきじゃない接尾辞であることを注意する« ドットの後に。
超演算子は回帰的にネストされた配列に定義されていて、そうだ:
-« [[1, 2], 3] # [-«[1, 2], -«3]
# == [[-1, -2], -3]
同じくその通りにやるインフィックスの dwimminess は繁殖する:
[[1, 2], 3] «+» [4, [5, 6]] # [[1,2] «+» 4, 3 «+» [5, 6]]
# == [[5, 6], [8, 9]]
いっそう一般には、その通りにやる超演算子が回帰的に何にでもマッチしているオブジェクトをもたらすIterable ロールがたとえオブジェクトであるとしてもそれ自身問題の演算子をサポートしない:
Bag(3,8,[2,Seq(9,3)],8) >>->> 1; # Bag(2,7,[1,Seq(8,2)],7) Seq(3,8,[2,Seq(9,3)],8) >>->> (1,1,2,1); # Seq(2,7,[0,Seq(7,1)],7)
特に、ノード種別を木に追い上げろIterable 意味規則使用可能訪問権:
$tree.».foo; # short for $tree.foo, $tree.list: { .».foo }
もしすべてのノードが演算をサポートしないなら、あなたは呼び出しがオプションであることを明示するそれのフォームを必要とする:
$tree.».?foo; # short for $tree.?foo, $tree.list: { .».?foo }
$tree.».*foo; # short for $tree.*foo, $tree.list: { .».*foo }
あなたはあなた自身の超演算子を定義することを許されない、なぜならそれらが修正されたスカラー演算子から完全に一貫した意味規則 derivable を持つために想定されるから。 もしあなたが数学的なベクトル積を探しているなら、これはあなたがそれを見いだすであろうところじゃない。 超演算子はあなたのコードが parallelizable であるあなたがオプティマイザに約束することができる方法の1つだ。 (上の木訪問は副作用を持つことを可能にされる、しかし方法で何ででも訪問権のオーダーで依存することはそれらの副作用を意味することにとって誤っている。 デフォルトまでに、少なくとも、 DAG 意味規則の後に続くために必要とされる超木の訪問ではない。)
並列処理をすることができるハードウェアがないのでさえ、もしそれらがより低いレベルのコードに環状になっているオーバーヘッドを要因から外すことができるなら、超演算子は対応するスカラー演算子より速いかもしれないか、あるいはループ展開最適化を応用することができるか、あるいはオペランドの周知の型に基づいて、(そして同じくハイパー演算子が「繰り返し」の間で相互作用を約束しないのに対して、ループの中のすべての演算が副作用なしであることが知られていないなら、ループの対応するスカラー演算子が同じ約束をすることができないという事実に基づいて) MMD ディスパッチオーバーヘッドのいくらかあるいはすべてを要因から外すことができる
特に、2時に超演算子を挿入しろint あるいはnum 配列がただ型 - 調べてすべてのために呼び出すべき正しい関数が対になって、そしてさらに何でも迂回することができることに気付く一つの MMD ディスパッチをすることが必要であるだけだ、あるいは、適切な型の低レベルの入り口点があることを知られているとき、型強制エントリーがこのような関数を指し示す。 (そして同様に賛成だ単項int
あるいはnum オペ。)
finalizable オブジェクトタイプのアプリケーション規模の分析が同じくこのような最適化に当てはまられることができるようにするかもしれないIntNumそしてそんなもの。 それがないので、部分的な MMD ディスパッチの実行時分析がオーバーヘッドを捜索して若干の MMD をセーブするかもしれない。 あるいは特定のオブジェクト配列が(彼・それ)ら自身の実行時型純粋を記録・追跡しさえして、そして部分的な MMD ディスパッチテーブルをキャッシュするかもしれない、それらがそれらを知っているときで超演算子で使われる可能性が高い。
そのすべてを越えて、「スカラーの配列」型がコンパイル時間に回帰的な hypers を必要としないことを知られている、それで演算は積極的に vectorized されることができる。
Hypers はハッシュにリストにと同様適用されるかもしれない。 この場合「dwimminess」が他のハッシュに存在しないキーを無視するべきかどうか言う、他方「非 dwimminess」がいずれかのハッシュにあるすべてのキーを使うように言う。 すなわち、
%foo «+» %bar;
あなたに鍵の交差点を与える、他方
%foo »+« %bar;
あなたにキーの組合を与える。 非対称の hypers は同じく有用だ;例えば、もしあなたが言うなら:
%outer »+» %inner;
ただ%すでに%の外の意志に存在する内面的なカギは結果に存在する。 しかしながら、あなたが欲するとは注意しろ
%outer »+=« %inner;
あなたが欲すると想定して、木の上に蓄積された統計値をパスするためにキーの組合を持つために、%外の。
たった1つのハッシュオペランドを持っている Unary ハッシュ hypers と2進法の hypers がハイパー演算子をただ値に適用するが、オリジナルのハッシュと同じキーのセットを持っている新しいハッシュ値を返すだろう。
なぜなら何でもまあジッパーでとまるから、あるいはその通りにやる超演算子は、何でも終わって傾く*
その最終の要素をとって、そしてそれを繰り返すことによって、非常に拡張可能であると考えられる:
@array, *
何かのために短い同種のもの:
@array[0..^@array], @array[*-1] xx *
hypers があなたが処理がどんなオーダーで起きるか気にしないこと、ただ結果として生じている構造がインプットと一貫した形式で終わるだけことを約束することに注意を払え。 演算が parallelized されるであろうというシステムからの約束がない。 有効な平行化があなたが救うより多くの付加の仕事をしないで仕事を分割する若干の手段を必要とする。 これは構造物から構造物へと異なるだろう。 特に、無限の構造が完全に処理されることができない、そしてシステムは怠惰の需要の外に並列処理と釣り合うことを可能にされる。 例えば、リストを2つの等しい部分リストに分けることを望むアルゴリズムが、あなたが長さを計算することが常にできるというわけじゃないから、もしあなたが前もって長さを計算しなければならないなら、機能しないだろう。 種々のアプローチがとられることができる:要求次第並列に処理されるためにバッチを渡すこと、あるいはNプロセッサ、あるいは何でものセットで roundrobin に挟むこと。 限界、単純な、非パラレルの、項目ごとのいい加減な実装以内にある仕様で、けれども効率的にマルチコアを使うことがありそうもない。 性能要件の外で、もし、これらのアプローチのどちらがとられるかについて、アルゴリズムが依存するなら、誤っている。
Any インフィックス演算子(連合しない演算子以外)がその演算を使って減量するリスト演算子を作成するために項ポジションで正方形の括弧によって囲まれることができる:
[+] 1, 2, 3; # 1 + 2 + 3 = 6 my @a = (5,6); [*] @a; # 5 * 6 = 30
すべてのメタ演算子と同じように、スペースではないが metatoken が中に入るのを許した。
縮小演算子がリスト演算子と同じ優先を持っている。 実際、縮小演算子が本当はリスト演算子であって、そして1(人・つ)として訴えられる。 従って、あなたは2つの方法の1つで縮小演算子を実装することができる。 あるいはあなたは明示的なリスト演算子を書くことができる:
proto prefix:<[+]> (*@args) {
my $accum = 0;
while (@args) {
$accum += @args.shift();
}
return $accum;
}
あるいはあなたは文通することに基づいたあなたに対する1が、おそらく通り過ぎてカリー化して演算子を挿入するシステム自(己・動)生成をそうさせることができる:
&prefix:<[*]> ::= &reduce.assuming(&infix:<*>, 1); &prefix:<[**]> ::= &reducerev.assuming(&infix:<**>);
もし縮小演算子が別に定義される、インフィックス演算子から、それが演算子が使ったと同じ方法を関連づけなくちゃならないなら:
[-] 4, 3, 2; # 4-3-2 = (4-3)-2 = -1 [**] 4, 3, 2; # 4**3**2 = 4**(3**2) = 262144
なぜならチェーン - 連合の演算子(好む<)、引数がそうであるすべてで、一緒に、とるただあなたが、明示的に:それを書き上げたかのように
[<] 1, 3, 5; # 1 < 3 < 5
もし2以下の引数が与えられるなら、ディスパッチが引数が与えられるものは何ででもまだ試みられる、そして2以下の引数を取り扱うことはそのディスパッチのレシーバー次第だ。 proto リスト演算子定義が最も一般的だ、それであなたが型に依存して1つの引数のケースを扱う異なった方法を定義することを許されることに注意を払え:
multi prefix:<[foo]> (Int $x) { 42 }
multi prefix:<[foo]> (Str $x) { fail "Can't foo a single Str" }
しかしながら、ゼロ引数のケースはディスパッチに上に、型情報がないから、このように定義されているはずがない。 識別情報値を指定することを望む演算子が、ゼロ引数をとる多変形を指定することによって、そうするべきだ:
multi prefix:<[foo]> () { 0 }
組込み演算子の間で、[+]() 0を返すそして[*]() 例えば1を返す。
デフォルトまでに、もし引数、組込みが減らす(の・もの・人)があるなら、演算子がそれを引数リターンする。 しかしながら、このデフォルトは演算子のための感覚を好ませない< これらの種類の演算子がいっそう有意義な何かを返すために一つの引数のケースに負担をかけ過ぎるように、それら撮影と同じ型を返さない. 連鎖法と矛盾しないために、意味規則、すべて比較演算子が戻るBool::True なぜなら1あるいは0の引数。
権限:が同じくコンマ演算子の減算演算子を作る。 これはただリスト演算子形に過ぎないのcircumfix:<[ ]> 匿名の配列生成するもの:
[1,2,3] # make new Array: 1,2,3 [,] 1,2,3 # same thing
組込みが減量する、演算子が次の識別情報値を返す:
[**]() # 1 (arguably nonsensical) [*]() # 1 [/]() # fail (reduce is nonsensical) [%]() # fail (reduce is nonsensical) [x]() # fail (reduce is nonsensical) [xx]() # fail (reduce is nonsensical) [+&]() # -1 (from +^0, the 2's complement in arbitrary precision) [+<]() # fail (reduce is nonsensical) [+>]() # fail (reduce is nonsensical) [~&]() # fail (sensical but 1's length indeterminate) [~<]() # fail (reduce is nonsensical) [~>]() # fail (reduce is nonsensical) [+]() # 0 [-]() # 0 [~]() # '' [+|]() # 0 [+^]() # 0 [~|]() # '' (length indeterminate but 0's default) [~^]() # '' (length indeterminate but 0's default) [&]() # all() [|]() # any() [^]() # one() [!==]() # Bool::True (also for 1 arg) [==]() # Bool::True (also for 1 arg) [before]() # Bool::True (also for 1 arg) [after]() # Bool::True (also for 1 arg) [<]() # Bool::True (also for 1 arg) [<=]() # Bool::True (also for 1 arg) [>]() # Bool::True (also for 1 arg) [>=]() # Bool::True (also for 1 arg) [~~]() # Bool::True (also for 1 arg) [!~~]() # Bool::True (also for 1 arg) [eq]() # Bool::True (also for 1 arg) [!eq]() # Bool::True (also for 1 arg) [lt]() # Bool::True (also for 1 arg) [le]() # Bool::True (also for 1 arg) [gt]() # Bool::True (also for 1 arg) [ge]() # Bool::True (also for 1 arg) [=:=]() # Bool::True (also for 1 arg) [!=:=]() # Bool::True (also for 1 arg) [===]() # Bool::True (also for 1 arg) [!===]() # Bool::True (also for 1 arg) [eqv]() # Bool::True (also for 1 arg) [!eqv]() # Bool::True (also for 1 arg) [&&]() # Bool::True [||]() # Bool::False [^^]() # Bool::False [//]() # Any [min]() # +Inf [max]() # -Inf [=]() # Nil (same for all assignment operators) [,]() # [] [Z]() # []
ユーザー定義の演算子が(彼・それ)ら自身の識別情報値を定義するかもしれない、しかし明示的な識別情報プロパティがない。 値は0 - arg の振る舞いでの暗黙が、それほど数学的なコードが見い出すことを望むという状態で、演算のための値が呼び出すことができる識別情報を和らげるということだprefix:["[$opname]"]()
それを発見するために。
減算演算子として何か他の非インフィックスの関数を呼び出すために、あなたはインフィックスフォームでエイリアスを定義してもよい。 たとえ aliasedな関数がそれをリストと解析したであろうとしても、インフィックスフォームは右の引数を項目と解析するだろう:
&infix:<dehash> ::= postcircumfix:<{ }>;
$x = [dehash] $a,'foo','bar'; # $a<foo><bar>, not $a<foo bar>
代わる代わる、ただあなた自身のものを定義しろprefix:<[dehash]> ルーチン。
それ、に注意するから減量するリスト演算子だ、引数リストはリストコンテキストで評価される. そのために次のことは正しくないだろう:
$x = [dehash] %a,'foo','bar';
あなたはその代わりに持っているだろう、から1(人・つ)を言え:
$x = [dehash] \%a,'foo','bar'; $x = [dehash] %a<foo>,'bar';
プラス面では、これはスターなしでうまくいく:
@args = (\%a,'foo','bar'); $x = [dehash] @args;
同じく、リストコンテキストが内部の配列を平らにして、そして傾くという事実から、減少した割り当てが特別でない構文的な dwimmery をする、そして従ってただスカラー割り当てだけがサポートされることは続く。 そのために
[=] $x, @y, $z, 0 [+=] $x, @y, $z, 1
同等であるそうすること
$x = @y[0] = @y[1] = @y[2] ... @y[*-1] = $z = 0 $x += @y[0] += @y[1] += @y[2] ... @y[*-1] += $z += 1
よりむしろ
$x = @y = $z = 0; $x += @y += $z += 1;
(そして、実際、後者はすでにとにかく表明することが容易で、そしていっそう明らかに途方もない。)
同様に、(ショート演算子のような)マクロの thunk - izing 特徴を持っているリスト - 結合の演算子がそれらのマクロのような特徴を失う。 権限:発言権
[||] a(), b(), c(), d()
最初の真の結果、しかしリストの評価が、意味規則ではなく、リストの意味規則までにコントロールされる復帰に||.
大部分の人たちが減量する、演算子が単純なスカラ値を返す、そして従って、項目あるいはリストコンテキストで評価されてそれらが存在するかどうか気にしない。 しかしながら、他のリスト演算子と関数と同じように、減算演算子が自動的に、あなたがインフィックスにそれを使うかもしれないように、リストコンテキストの中に補間挿入されるであろう傾きを、スカラーと同様、リストの上に稼働する演算子リターンするかもしれない:
my ($min, $max) = [minmax] @minmaxpairs;
縮小メタ演算子の変形がおおかたリストを作り出すことを保証される;最終の結果とともにいい加減にすべての中間結果を生成するために、あなたは演算子をバックスラッシュすることができる:
say [\+] 1..* # (1, 3, 6, 10, 15, ...)
偶然のトライアングルではないの視覚的写真。 リストの三角形のリストを生産するために、あなたは「三角形のコンマ」を使うことができる:
[\,] 1..5 [1], [1,2], [1,2,3], [1,2,3,4], [1,2,3,4,5]
もし中間のあいまい性があるなら三角形減量するそしてバックスラッシュから始まる2項演算子、2項演算子が選ばれる、そして付加のバックスラッシュが対応する三角形の人たちが減量することを示す. インフィックスを定義している結果としてバックスラッシュで始まっている演算子infix:<\x> ねえ、それ以来、ある特定の三角形の簡約演算子を書くことを不可能にするだろう[\x] 標準の縮小を意味するだろうのinfix:<\x> 三角形の縮小ではなく、演算子のinfix:<x>. これはささいな問題であるとみなされる。
演算子を鎖でつなぐことについての三角形の縮小が常に1つ以上から成り立つTrue 値が0かそれ以上によって後に続かれるFalse 値。
クロスメタ演算子、X存在するかもしれない、そしてそれに続いて何でも演算子を挿入する.
それはすべての普通の(人たち・もの)によって同じぐらいリターンされるそのリスト引数の組分けの向こう側に修正された演算子を応用するinfix:<X> 演算子。
すべての生み出されたクロス演算子はリストインフィックス優先の(こと・もの)であって、そしてリスト結合性だ。
フォームを連結している文字列はそうだ:
<a b> X~ 1,2 # 'a1', 'a2', 'b1', 'b2'
X~ 演算子 desugars 値:
(<a b>; 1,2).crosswith(&[~])
それは今度は意味する
(<a b>; 1,2).cross.lol.map { .reduce(&[~]) }
それに注意しろ
<a b> X~ 1,2 X+ 3,4
何かが好むことを意味することができた
(<a b>; 1,2; 3,4).cross.lol.map { .reduce({$^a ~ $^b + $^c}) }
けれどもそれは連合じゃない状態でそうな同一でないリスト結合性演算子が見なした(とき・から・につれて・ように)現在非合法だ。 権限:が、しかしながら、常に括弧を明示的であるために使う:
<a b> X~ (1,2 X+ 3,4)
フォームを連結しているリスト、X,使われるとき、これが好きだ:
<a b> X, 1,2 X, <x y>
生産する
('a', 1, 'x'),
('a', 1, 'y'),
('a', 2, 'x'),
('a', 2, 'y'),
('b', 1, 'x'),
('b', 1, 'y'),
('b', 2, 'x'),
('b', 2, 'y')
X, 演算子が多分いっそう明らかに書かれるけれどもX[,]. しかしながら、このリスト形式はショートカット、普通のインフィックスを持つのに十分よくあるX 以前に記述された演算子。
汎用書式、何のためにも存在する、突然変異しないインフィックス演算子が使われるかもしれない。
1,2 X* 3,4 # 3,4,6,8
(それに注意しろ<== そして==> すべての代入演算子と同様、突然変異することと見なされる。)
もし原因となっている演算子が非を関連づけるなら、クロス演算子もそうだ:
@a Xcmp @b Xcmp @c # ILLEGAL @a Xeq @b Xeq @c # ok
実際、けれどもX 演算子は統語論上連合のすべてのリストだ、原因となっている演算子はそれ自身の結合性で常に適用されている、対応する人たちが減量するのとちょうど同じ(ように・時に)、演算子が十分だろう。
その唯一の最初項に注意すのX 演算子は適度に無限のリストであるかもしれない。
すべてのリストはフラットであると考えられる;多次元のリストが、最初の次元を唯一の次元として扱うことによって、扱われる。
活気メタ演算子、Z存在するかもしれない、そしてそれに続いて何でも演算子を挿入する.
それはすべての普通の(人たち・もの)によって同じぐらいリターンされるそのリスト引数の組分けの向こう側に修正された演算子を応用するinfix:<Z> 演算子。
すべての生み出された zip 演算子はリストインフィックス優先の(こと・もの)であって、そしてリスト結合性だ。
フォームを連結している文字列はそうだ:
<a b> Z~ 1,2 # 'a1', 'b2'
Z~ 演算子 desugars 値:
(<a b>; 1,2).zipwith(&[~])
それは今度は意味する
(<a b>; 1,2).zip.lol.map: { .reduce(&[~]) }
それに注意しろ
<a b> Z~ 1,2 Z+ 3,4
何かが好むことを意味することができた
(<a b>; 1,2; 3,4).zip.lol.map: { .reduce({$^a ~ $^b + $^c}) }
けれどもそれは連合じゃない状態でそうな同一でないリスト結合性演算子が見なした(とき・から・につれて・ように)現在非合法だ。 権限:が、しかしながら、常に括弧を明示的であるために使う:
<a b> Z~ (1,2 Z+ 3,4)
[推測:もう1つのアプローチが寄付を伴うだろうX そしてZ メタ演算子オリジナルの演算子の優先に対応しているリスト演算優先の中の subprecedence 、それでそれZ~ そしてZ+ 実際に、リスト演算優先の中で異なったオペレータ順位文法を持て。 それから、あなたが言ったかのように、上の(人たち・もの)は解析をするだろう<a b> Z~ ( 1,2 Z+ 3,4> )、リスト以外ピュッという音よりしっかりと、カンマで、リストインフィックス優先においてまだ解析をするだろう。
(これは実際にかなり些細だろう、から、我々がどのように文字列として我々の優先を表すかという状況で、実装しろ。) 同じく、説明することが複雑であるけれども、中で subprecedence しろZ 正確に世間知らずのユーザーが期待するものであるかもしれない。]
フォームを連結しているリスト、Z,使われるとき、これが好きだ:
<a b> Z, 1,2 Z, <x y>
生産する
('a', 1, 'x'),
('b', 2, 'y')
Z, 演算子が多分いっそう明らかに書かれるけれどもZ[,]. しかしながら、このリスト形式はショートカット、普通のインフィックスを持つのに十分よくあるZ 以前に記述された演算子。
汎用書式、何のためにも存在する、突然変異しないインフィックス演算子が使われるかもしれない。
1,2 Z* 3,4 # 3,8
(それに注意しろ<== そして==> すべての代入演算子と同様、突然変異することと見なされる。)
もし原因となっている演算子が非を関連づけるなら、クロス演算子もそうだ:
@a Zcmp @b Zcmp @c # ILLEGAL @a Zeq @b Zeq @c # ok
実際、けれどもZ 演算子は統語論上連合のすべてのリストだ、原因となっている演算子はそれ自身の結合性で常に適用されている、対応する人たちが減量するのとちょうど同じ(ように・時に)、演算子が十分だろう。
それに注意する、同じじゃないX 演算子、すべて項のZ 演算子がそうするかもしれない、合理的な be の無限のリスト、それ以来ジッパーでとまることはいい加減だ。
すべてのリストはフラットであると考えられる;多次元のリストが、最初の次元を唯一の次元として扱うことによって、扱われる。
連続メタ演算子、Sどんな非 fiddly 2項演算子によってでも後に続かれるかもしれない.
それは明白な何もあるいは暗黙の平行を隠して、そしてオプティマイザがオペランド評価を再注文するのを阻止する。 「S」は連続的で、連続的な、同時の、ショート、シングルスレッドと Safe のために地位と考えられることができる。
とりわけ。 特に、我々はそうしたことがあり得る:
a S& b S& c short-circuited AND junction a S| b S| c short-circuited OR junction a S^ b S^ c short-circuited XOR junction a S»op« b single-threaded hyperop a SX* b single-threaded X* a SX[*] b single-threaded X* a S[X*] b single-threaded X* a S+ b suppress arg reordering by ignorant optimizer
このメタ演算子はそのベース演算子として同じ優先と結合性を持っている。
コンパイラは何でも捨てることが自由だS 1インチのように、証明可能なように冗長なメタ演算子S||. コンパイラは直感で知ることが自由だS 何に関してもそれがさもなければ演算子の意味規則を変えない周知の激しやすい演算数に関する演算子。
[推測の:メタ演算子が内側から外部まで観念的に応用であるときから時、メタ演算子の保有、オーダー、を直列化して、そして逆にすることについての意味規則:
a SR/ b evaluates b, then a, then does b/a a RS/ b evaluates a, then b, then does b/a a RSR/ b evaluates b, then a, then does a/b
・・・多分。 同じく他の方法で...そのすべてを論じることができる。]
どこでもあなたは普通のインフィックス演算子を使ってもよい、あなたはインフィックスを使ってもよい、演算子が意味を同じを持っている角カッコで囲った。 (空白文字が許されない。) 従ってあなたは正方形の括弧を metatoken の中でさもなければ誤解されるかもしれない連続のあいまいさを排除することか、あるいは、 metatoken に多数のメタ演算子があるとき、特定の適用順序を強制するために使うかもしれない:
@a [X+]= @b @a X[+=] @b
metatokens が決して内部の空白文字であいまいさを排除されないかもしれないから、演算子とその関連づけられたメタ演算子がコンパイラにもしそうでなければさえ、リーダーに、紛らわしいであろう文字を共有するとき、括弧の使用は特に有用だ:
@a >>>>> $b # huh? @a >>[>]>> $b # oh yeah
Any インフィックス関数が直接後で正方形の括弧を使って標準のロング形式あるいは短縮フォームによって名詞として参照されるかもしれない& シギル:
&infix:<+> &[+]
これは関数出願のために都合が良い:
1, 1, &[+] ... * # fibonacci sequence sort &[Rleg], @list # reverse sort as strings
&[op] たとえそれが根本的に variadic リスト - 結合性演算子と定義されるとしても、形式が常に演算子の2進法の関数を参照する。
演算子、しかしそれらが演算子を用いて通常、通り過ぎて作成されて存在するかもしれない単項の賛成の対応する形式がない*:
sort -*, @list # sort reversed numerically
変数宣言子のリストは拡張したからmy そしてour
次のものを含む:ために
my $foo # ordinary lexically scoped variable our $foo # lexically scoped alias to package variable has $foo # object attribute state $foo # persistent lexical (cloned with closures)
Variable 宣言子のようmy 今シグネチャーをそれら引数であると思え。 (関数シグネチャーの構文はいっそう完全に S06 で記述される。)
シグネチャーの周りの括弧はシングルをその関連づけられた型で進んだ変数、トレイトと初期化演算子だと宣言する単純な宣言のために除かれるかもしれない:
my Dog $foo is woof = 123; # okay: initializes $foo to 123 my (Dog $foo is woof = 123); # same thing (with explicit parens) my :(Dog $foo is woof = 123); # same thing (full Signature form)
constant 宣言詞がいずれかの変数を宣言することができるか、あるいは定数をコンパイル時と名付ける:
constant $foo = 1; # compile-time constant variable constant bar = 2; # compile-time constant symbol
なぜならそれは「型」スペースに名前を宣言することができるから、constant
宣言詞が、シグネチャーを使って、どちらがあいまいであるであろうかについて意志表示しないかもしれない。
それぞれの宣言詞が(あなたがどの宣言詞を使うかについて、初期化のタイミングが今度は依存するコンテナの自然の生涯スコアの上に依存するから、標準の割り当てと混同されるべきじゃない)等号に引き続いて初期化演算子を飲むことができる。
my $foo = 1; # happens at the same time as normal assignment our $foo = 1; # happens at INIT time has $foo = 1; # happens at BUILD time state $foo = 1; # happens at START time constant $foo = 1; # happens at BEGIN time
(それほど意味規則的に注意するのour 同時に初期化が起きる Perl 5 と異なった as a my. あなたが持つであろう Perl 6 での同じ効果に言うようにさせるために「(our $foo) = 1;」その代わりに。)
もしあなたがコンテナを初期化しないなら、それはその自然の生涯スコアの始まりに未定義に始まる。 (言い換えれば、あなたは古い Perl 5 トリックを使うことができないの「my $foo if 0」静的な変数を得るために、からmy 変数はその前の値を維持するよりむしろ Perl 6 に毎回完全にイニシャライズされていないように始まる。) 未定義のコンセプトをサポートしないネイティブの整数コンテナがその代わりに0に初期化されるべきだ。 (浮動小数点のコンテナがデフォルトによって初期化される Native NaN.) タイプされたオブジェクトコンテナが正しい型の未定義の型オブジェクトを含んでい始める。
リスト - コンテキスト擬似割り当てがシグネチャーデフォルトでではなく、単純な宣言のためにサポートされる:
my @foo = 1,2,3; # okay: initializes @foo to (1,2,3) my (@foo = 1,2,3); # wrong: 2 and 3 are not variable names
括弧が除かれる、あなたが何でも使うかもしれないとき、割り当て演算子を挿入しろ= 初期化演算子として。 このような場合、左側はインフィックス演算子について変数のプロトタイプオブジェクトだろう:
my Dog $fido .= new; # okay: a Dog object my Dog $fido = Dog.new; # same thing my Dog $fido = $fido.new; # wrong: invalid self-reference my (Dog $fido .= new); # wrong: cannot use .= inside signature
極めて少数しか突然変異している演算子が、しかしながら、型から型オブジェクトの上に意味をなさない、オブジェクトが一種の未定義のオブジェクトであるとは、注意しろ。 (識別情報値と一緒のそれらの演算子は同じぐらい上に指摘された例外だ。)
括弧が常に、多数のパラメータを宣言するとき、使われなくちゃならない:
my $a; # okay my ($b, $c); # okay my ($b = 1, $c = 2); # okay - "my" initializers assign at runtime my $b, $c; # wrong: "Use of undeclared variable: $c"
宣言詞とシグネチャーの間に起こっている型がそれぞれの変数の中に配られる:
my Dog ($b, $c); my (Dog $b, Dog $c); # same thing
[30次のことがおそらく S06 に属する。]
作成している賛成の構文Signature パーサーがすでに1(人・つ)を期待していないオブジェクトがそうだ:
:(Dog $a, *@c)
これはこのように使われるかもしれない:
my $sig = :(Dog $a, *@c);
シグネチャーが宣言子の後にそんなものに予想されるけれどもmysubmethodruleなど. このような宣言子でコロンは除かれるかもしれない。 けれどもそれはそれを使うために同じく正当だ:
my :($b, $c); # okay
sub foo :($a,$b) {...} # okay
-> 「pointy ブロック」トークンが同じくシグネチャーを開始する、しかしこの場合あなたはコロンと括弧両方を除かなくちゃならない。 例えば、もしあなたがループについて「変数を輪にしろ」を定義しているなら、ブロックしろ:
for @dogpound -> Dog $fido { ... }
もしシグネチャーがそうであるなら割り当てたから(宣言されるか否かにかかわらず、あるいはコロン形式)、シグネチャーは変数と割り当ての普通のルールが適用する左辺値のリストに変換されるが、右側と割り当ての評価が起きること以外時間に決定する宣言詞によって.
(でmy これは常に普通の割り当てが起きるであろう時だ。)
もしシグネチャーが割り当てに変換するにはあまりにも複雑であるなら、コンパイル時エラーが発生する。 シグネチャーへの割り当てが、それほど、普通の割り当てと同じ項目 / リスト特質を作る
my $a = foo(); # foo in item context my ($a) = foo(); # foo in list context
もしシグネチャーが引数にバインドされるなら、シグネチャーが関数のために、それ以外、関数呼び出しの場合と異なり仮パラメータであるかのように、リスト、それから引数をバインドすることが進む、パラメータはバインドされるrw デフォルトによってよりむしろreadonly. 上にバインディングを見ろ。
それに注意しろtemp そしてlet それら結果がただランタイムに起きるだけであるから、変数宣言子じゃない。 そのために、それらが普通の左辺値オブジェクトをそれら引数であると思う。 もっと多くの詳細については S04 を見ろ。
変数宣言子じゃない多くの他の宣言子がある。 これらは両方の型宣言子を含む:
package Foo module Foo class Foo role Foo subset Foo enum Foo constant Foo
そしてコード宣言子:
sub foo method foo submethod foo multi foo proto foo macro foo quote qX regex foo rule foo token foo
これらはすべてそれらの使用を持って、そして次の Synopses に説明される。
それほどそれ以来注意しろconstant (本質的に一つの値で型を宣言している)型宣言詞と解析される、それは先頭で実際に範囲宣言詞を要することができる:
my constant companion = 'Fido'; has constant $.pi = 22/7; state constant $latch = snapshot(); # careful with this!
しかしながら、一定の宣言詞はコンパイラがインライン化することができる値を作成するように意図される、それでそれは常に BEGIN 時間にその値を評価する。
それで付加の範囲宣言詞が値がどこ(で・に)記憶されるか、そしてその記憶域がいつ初期化されるか言うかもしれない間に、それはインスタンスからインスタンスまでそれの値を変えることができない。 一般に、もしあなたが範囲宣言詞の標準の生涯にわたってさまざまじゃない何かを欲するなら、それを読み取り専用値使用方法に初期化しろ::= 定数としてそれを宣言するよりむしろ。 それで範囲宣言詞が使われるたびに、それは値を異なった読み取り専用に初期化することができる:
state $latch ::= snapshot(); # each clone gets its own value of $latch
5が使用によって関数の引数リストの補間を強制した Perl & 接頭辞。 それほどその代わりに、 Perl 6 のそのオプション is no longer available | 前置演算子が補間回路として、その演算数を配役することによって、そうするのに役立つCapture オブジェクトとキャプチャの部分を現在の引数リストに挿入すること。
この演算子は補間挿入されるために使われることができるArray あるいはHash
現在の呼び出しに打ち込んでいて、同じぐらいそれぞれ守備の、そして引数という名前の。
結果として生じている引数がまだサブルーチンのシグネチャー、しかしプレゼンスに従わなくちゃならない注目| その引数(そして何のためにでも次の引数)の間ランタイムまでそのテストを延期する:
my $args = \(@foo, @bar); push |$args;
同等の値:だ
push @foo, @bar;
しかしながら、
my $args = \(@foo: @bar); push |$args;
その代わりに同等の値:だ
@foo.push(@bar);
| その引数を回す中にArrayけれども、その代わりに直接その引数を変換する中にCapture:
my @args = \$x, 1, 2, 3; say |@args; # say(\$x, 1, 2, 3);
これのために、|%args 常に名指された引数、を生産するそして|@args 常に位置の引数を生産する。
リストコンテキスト、でScalar 持ちこたえるArray オブジェクトが平らにならない。 従って
$bar = @bar; @foo.push($bar);
ただシングルを押すArray 反対しろ@foo. 権限:がこれらの方法の1つで明示的にそれを平らにする:
@foo.push(@$bar); @foo.push($bar[]); @foo.push(|$bar);
素晴らしい人たちがインチを配列するから、それらの3つのフォームは機能するpush「sシグネチャーが平らになるArray リスト引数の中へのオブジェクト。
最初の2つのフォームが同じくあなたを許すとは、注意しろ、から割り当てにリストコンテキストを指定しろ:
@$bar = 1,2,3; $bar[] = 1,2,3;
長い間そうである必要がある展開式が配列に左辺値を投げる、形式が左辺値の「arrayness」を近くしておくことができる第2が割り当て演算子を投げる:
$foo.bar.baz.bletch.whatever.attr[] = 1,2,3;
空き[] そして.[] 後置演算子が、要素を返さない1次元のゼロのスライスとしてではなく、配列全体を返しているゼロ - 次元の添え字として解釈される。 同じく賛成だ{} そして.{} ハッシュに、同様に as the <>.<>«»そして.«» 一定の、そしてスライス添え字指定フォームを補間挿入している。
| 演算子がいい加減に賛成に補間挿入されるArray そしてRange オブジェクト。
5がする Perl のような直前の書き入れを得て、付け加えることeager リスト演算子:
func(|(1..Inf)); # works fine func(|eager 1..Inf); # never terminates (well, actually...)
関数の帰りの値を補間挿入するために、あなたは言うことができる:
push |func();
このような引数リストの中で、あなたが言ったかのように、関数リターン値はそれら各地の中に自動的に分解だ:
my $capture = \(func()); push $$capture: @$capture, %$capture;
あるいは何かそのようなもの。 | それからコンテキストに適切に依存している種々の地域を扱う。 インボカントがただ外の関数呼び出しに最初の引数として意味をなすだけだ。 どこでもほかにただ差し込まれたインボカントがそのリストの前部において、そのコロンがコンマに戻るかのように位置の引数になる。
もしあなたがすでにキャプチャ変数を持っているなら、あなたはすぐに使ってそのすべてのビットを補間挿入することができるprefix:<|> 演算子:
my (|$capture) := func(); push |$capture;
多数の配列にわたって平行した繰り返しをサポートするために、 Perl 6 はそうしたzip それがリストを作る関数Seq 2かそれ以上の配列の要素からのオブジェクト。 これがリストとして作用する普通のリストコンテキストでCaptures そして自動的に平らになる。
for zip(@names; @codes) -> $name, $zip {
print "Name: $name; Zip code: $zip\n";
}
zip インフィックス同義語、を持つZ 演算子。
しかしながら、明示的に多次元のリストコンテキストで、連続は subarrays に変わる、そしてそれぞれの要素がそれからシグネチャーによって包みから取り出されなければならないだろう:
for lol(zip(@names; @codes)) -> [$name, $zip] {
print "Name: $name; Zip code: $zip\n";
}
デフォルトによってzip 関数が最も短いリストの終わりに読む、しかし最終候補者リストが常にパッティングによって独断的に延長されるかもしれない*
決勝戦の後に値、どちらかは必要に応じて多くの回数として最終の値を繰り返す。 もし、最終候補者リストのためにデフォルト値を供給する代わりに、あなたがただ欠けている項目、使用を省略することを望むならroundrobin その代わりに:
for roundrobin(@queue1; @queue2; @queue3) -> $next {
...
}
空白文字が配列あるいはハッシュ添え字の括弧開始、あるいは引数リストの冒頭の括弧の前にもう許されない。 すなわち、:
@deadbeef[$x] # okay
@a [$b] # WRONG
%monsters{'cookie'} # okay
%people {'john'} # WRONG
saymewant('cookie') # okay
mewant ('cookie') # WRONG
この制限のいくつかの有用な副作用の1つが括弧がコントロール構造の状態の頃にもう必要とされないということだ:
if $value eq $target {
print "Bullseye!";
}
while $i < 10 { $i++ }
それは添え字を一列に並べるために、しかしながら、まだ可能である、そして他の後置演算子が(S02 参照)通り過ぎて明示的に unspace 構文を使っている:
%squirrels{'fluffy'} = Squirrel.new;
%monsters.{'cookie'} = Monster.new;
%beatles\.{'ringo'} = Beatle.new;
%people\ .{'john'} = Person.new;
空白文字は中に入っている、概要が何の間にもキーワードと添え字あるいは関数引数を開始していない括弧を開始している何でも必要とした。 括弧によって直接後に続かれた Any キーワードがその代わりに関数呼び出しと思われるだろう。
if $a == 1 { say "yes" } # preferred syntax
if ($a == 1) { say "yes" } # P5-ish if construct
if($a,$b,$c) # if function call
それは賛成で可能だif() 同じくマクロ呼び出しに訴えるために、しかしもしそうであるなら、それprefix:<if> マクロよりむしろstatement_control:<if> マクロ。
ある特定の演算子がシーケンスポイントを供給することを保証される。 いずれかの thunk (いい加減なかなりのコード)が何か他の評価の結果に基づいて条件付きで評価されるときはいつでも、シーケンスポイントは保証されている、それでショートと条件演算子はすべてシーケンスポイントを提供する。
ある特定の他の演算子が、 junctional 演算子、超演算子と飼料演算子を含めて、シーケンスポイントの欠如を保証する。 これらの演算子はあなたがコードのビットだと見なす編集者に、もしそれらのようであるなら、それらが並列に稼働することができるように、お互いに依存しないことを約束する。
多数の演算子(そんなものけれども+)中央の中で立ち往生していて、そして明日ではなく今日であるが、かもしれない連続的な振る舞いを示すかもしれない.
これらの演算子の1つを連続的であるか、あるいは平行した振る舞いに頼るプログラムが誤っている。 我々が parallelizing オプティマイザを書いている人々からもっと多くのフィードバックを受けとる(とき・から・につれて・ように)、我々は2つの指定されたセットの1つの中に分類していない演算子について種々であると分類するべき権利を保留する。 (我々はこれらの3セットの演算子に良い名前を与える必要がある。)