yield無くてもthreadあれば楽勝…と思ってたが、仕様の壁だらけ。foo++のオペレーターオーバーロードの挙動が酷い。
それと関数の戻り値にautoが使えないのが色々ときついなぁ。そういえば実装の予定がされているstatic foreachってスコープありだっけ? 無しだっけ?
#それとpause/resumeって確かJavaだと非推奨扱いになってたと思うけど何でだっけか。スレッドのモニタに問題起こる? それとも単純にモニタ使えってこと?
import std.stdio, std.thread; class Iterator(T, U){//スレッドアンセーフなのでよろ private T value; private bool end = false; private Thread th; this(U obj){ th = new Thread(delegate int(){ foreach(i;obj){ value = i; th.pause; } end = true; return 0; }); th.start; } T opStar(){ return value; } // Iterator!(T, U) opPostInc(){//戻り値が使用されないし遅延してもくれない… Iterator!(T, U) opAdd(int i){ assert(i==1); th.resume; Thread.getThis().yield; if(end) return null; return this; } } /*itertype*/Object createItarator(T)(T t){ foreach(i;t){ alias Iterator!(typeof(i), T) itertype; return new itertype(t); } } void main(){ int[] foo=[1,2,3,4,5]; auto iter = cast(Iterator!(int,int[]))createItarator(foo); for(;iter;/*iter++*/iter=iter+1) writefln(*iter); }