公開型メモ帳

ますます激しくなる物忘れへの対策

【Perl6】謎の角カッコは「あいまいさ解決」のカッコだった

前の記事で書いたように、下の例がうまくいくのに、
なぜうまくいくのかが分からなかった。

# 変数 $str の前に 'abc' を追加する
$str [R~]= 'abc';


この角カッコは文法的にどんな意味があるのか分からなかったが、
ちょっと調べたらちゃんとPerl6の公式ドキュメント(英語)に書いてあった。

Operators

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';

のように角カッコで明示的に指定する。

ちなみに、角カッコなしの場合はどうなるかというと・・・後者に解釈される。
(こういうのをいちいち覚えなくてよいように角カッコを使うわけ。)

謎が解けてすっきりした。



実はこの角カッコ、いろいろ面白い性質があるのを見つけた。
これも時間ができたらまた書きたい。
書かないと忘れる。