数列演算子

この記事は、Perl6 Advent Calendar 2011の11日目です。


今日はオブジェクトの話から少し離れて、数列演算子を紹介しましょう。
infix:<...>は、数列を生成する演算子です。単純に数字をおいた場合、第一オペランドから第二オペランドまで1ずつ変化する数列を返します。

> 1...4
1 2 3 4
> 4...1
4 3 2 1

第一オペランドに要素数2のリストを指定する事で、その2数の差を公差とする等差数列が得られます。

> 2,4...10
2 4 6 8 10
> 5,3...-7
5 3 1 -1 -3 -5 -7

この時注意すべき事は、この演算子は第二オペランドが出現するまで計算を繰り返す点です。次の例を見てください。

> 2,4...9
#(無限ループ)

この場合、2,4,6,8,10…と計算を続けていきますが、永遠に9は出てこないので無限ループに突入します。


第一オペランドに要素数3のリストを指定する事で、その3数の比を公比とする等比数列が得られます。

> 2,4,8...64
2 4 8 16 32 64

この場合も等差数列と同様に、第二オペランドが終端できない場合、無限ループに陥ります。

無限リスト

この演算子の面白い点は、第二オペランドアスタリスク(*)を指定する事で、無限リストを生成できる点です。

> 3...*
...
> 3,2...*
...
> (3,2...*).[^10]
3 2 1 0 -1 -2 -3 -4 -5 -6

変数に代入する事もできます。

> my @a = 3,2...*
...
> @a[^10]
3 2 1 0 -1 -2 -3 -4 -5 -6

まとめ

数列演算子を使う事で、単純な数列であれば簡単に作る事ができます。また、(この記事では割愛しますが)gather-takeを使って遅延評価リストを使う事もできます。