Reduction Meta Operatorの例

Perl6における標準的な魔法のお話です。Perl5とPerl6には互換性がないので注意してください。
Reduction Meta Operatorはメタオペレータ、つまり演算子に作用する演算子です。結果としてはLispに近いものを感じますが、ちょっと違う気もします。またこの場合のReductionとは、記述を楽にする、という程度の意味合いです。

実行例

例1

1から10までの和を求める

say [+] (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

実行結果

55

これは以下のコードと等価です。

say 1+2+3+4+5+6+7+8+9+10;

また、1..10と(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)は同じなので、以下のように書くこともできます。

say [+] 1..10;
例2

4の2の3乗乗を求める(4^(2^3)です)。

say [**] (4, 2, 3);

実行結果

65546

これは以下のコードと等価です。

say 4 ** 2 ** 3;

この際注意すべきは、冪乗の演算は右結合なので、2**3が先に計算され、その結果と4とで計算が行われるという点です。カッコをつけて書くと4 ** (2 ** 3)という具合です。

例3

階差数列を作る

my @list = [\+] 1..10;

この結果、@listには、以下の数列が入ります。

1 3 6 10 15 21 28 36 45 55

演算子の前に\を付けると、1回1回計算した結果が、リストとして返されます。
この場合1, 1+2, 1+2+3, 1+2+3+4, .....といったリストが返されました。

例4
my @list = (1, 1, 1, 1, 1, 1, );
if [==] @list {
        say 'yes!!!!!!';
}

実行結果

yes!!!!!!

解説
Perl6での==演算子は、chain operatorと呼ばれ、連続して使用することができます。なので

0 == 0 == 0 == 0 == 0

は真になります。似たようなものとして

1 < 2 < 3 < 4 < 5 < 6

も真です。
これを踏まえて[==] @listを考えると、

@list[0] == @list[1] == @list[2] == @list[3] == @list[4] == @list[5]

*1
と同じであることがわかります。なのでこの式は真となり、yes!!!!!と表示されるわけです。

注意

べき乗の計算を見てのとおり、演算子が右結合か左結合かを意識しなければいけません。
また演算子を[ ]で囲む際、左右に余分なスペースを入れてはいけません。

*1:Perl6では、配列の要素にアクセスするときも、$ではなく@を使います。