PseudoArray
mapやcollect、filterなどの関数は、イテレータを返すのではなく、PseudoArrayを返す、という仕様に変更することにしました。
PseudoArrayは、生み出されたときはIteratorとして振る舞い、Iteratorに無くArrayにあるメソッドを呼ばれた瞬間からArrayとして振舞います。
独自のPseudoArrayを自分で定義する方法は、block_nextメソッドを定義したクラスにinheritするだけです。
Range: class(PseudoArray){ _lower; _upper; _current; initialize: method(_lower, _upper){ _current = _lower; } block_next: method(){ if(_current<_upper){ temp: _current; _current++; return this, temp; } return null; } } // 配列のメソッドspliceを呼び出す Range(5, 15).splice(5, 3).p; // イテレータとして使う Range(5, 15){ it.p; }
C++で定義する場合も、同様にPseudoArrayをinheritするだけなので、とても容易に定義できます。
PseudoArrayは特殊なクラスとなっており、Arrayのメソッドを呼ばれて始めてインスタンス変数などの領域を確保するので、メモリ負荷はこれまでのモノと変わりはありません。
ただ、メソッドの転送などが入るため、理論上は若干ですが速度が落ちることになります。ベンチマークを見てみたら、本当に若干すぎて影響は無いようでしたが。
each_hoge, hoges というのも、hogesだけに統一します。