【Perl6】謎の角カッコは「あいまいさ解決」のカッコだった
前の記事で書いたように、下の例がうまくいくのに、
なぜうまくいくのかが分からなかった。
# 変数 $str の前に 'abc' を追加する $str [R~]= 'abc';
この角カッコは文法的にどんな意味があるのか分からなかったが、
ちょっと調べたらちゃんとPerl6の公式ドキュメント(英語)に書いてあった。
Nesting of Meta Operators
To avoid ambiguity when chaining meta operators use square brackets to help the compiler to understand you.
my @a = 1,2,3; my @b = 5,6,7; @a X[+=] @b; say @a; # [19 20 21]
(訳)
メタ演算子のネスト
メタ演算子がつながっている場合には、角カッコを使うことであいまいさをなくし、コンパイラにあなたの意図を伝えることができます。
実は「~=」の「=」もメタ演算子の一種で、中置演算子「~」に作用している。
よって、
$str R~= 'abc';
は、「R」と「=」の2つのメタ演算子が連結している状態になる。
ここで、間に挟まれている「~」がどちらにくっつくのかはっきりさせるのには、
$str [R~]= 'abc';
や、
$str R[~=] 'abc';
のように角カッコで明示的に指定する。
ちなみに、角カッコなしの場合はどうなるかというと・・・後者に解釈される。
(こういうのをいちいち覚えなくてよいように角カッコを使うわけ。)
謎が解けてすっきりした。
実はこの角カッコ、いろいろ面白い性質があるのを見つけた。
これも時間ができたらまた書きたい。
書かないと忘れる。