範囲式を追加する

範囲式を追加することにしました。

  • a..b で終端を含むaからbの範囲式
  • a...b または a..< b で終端を含まないaからbの範囲式となります

範囲式で得られるオブジェクトは、Rangeクラスのインスタンスです。
RangeクラスはEnumeratorを継承しており、ブロック文を適用できたり、to_aやmap、with_indexなど、Enumerator、Iteratorのメソッドを呼び出せます。

5..8 {
  it.p;
}
//=>5
//=>6
//=>7
//=>8

5...8.to_a.p; //=> [5,6,7]
3..6.with_index.to_a.p; //=> [[0,3],[1,4],[2,5],[3,6]]
1..3.zip("ま".."む").map(%f(%d=%d)).to_a.p; //=> [1=ま,2=み,3=む]  

Rubyと違い、範囲式の優先順位は非常に高く設定しました。関数呼び出しなどと同じレベルとなっています。
そのため、1..5.to_a という式は (1..5).to_a と同じ意味となります。

と、したのですが、一つ問題があって、単行マイナスより優先順位が高くなるため、-1..10 は -(1..10)と解釈されてしまいます。
これを避けるには、(-1)..10 とするか、-1 .. 10 と*1する必要があります。

左辺に単行マイナスをつけることよりも、.to_aなどのメソッド呼び出しの方が使う頻度が高いと思ってとりあえずこうしてみたのですが、本当にこれでいいのか悩んでいます。

*1:空白による優先順位のコントロール