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では、配列の要素にアクセスするときも、$ではなく@を使います。