forを作ろう!その2
こっちのほうが素敵ですね。
import std.c.stdio; for__!(T) for_(T)(out T t){ for__!(T) f; f.ptr_ = &t; return f; } struct for__(T){ T* ptr_; T[] ary_; for__!(T) in_(T[] ary ...){ ary_ = ary; return *this; } void opCall(void delegate()[] stats ...){ foreach (T t; ary_){ *ptr_ = t; foreach (void delegate() stat; stats){ stat(); } } } } void main(){ int i; for_(i).in_(1, 2, 3)( printf("%d", i) ); char c; for_(c).in_('h', 'o', 'g', 'e')( printf("%c", c) ); char[] s; for_(s).in_("hige", "huge")( printf("%.*s", s) ); }
123hogehigehuge
またRubyかよ!といわれそうです。
あと、勿論'h', 'o', 'g', 'e'は"hoge"でもいいです。意図が伝わりやすいように書いてます。
追記:
03:23 (she) for_(i).in_(1, 2, 3).in_(1, 2)( とかできちゃうんですが
03:23 (she) for_(i)(printf("%d\n", i)); あるいはこれも
03:24 (niha) その辺はだいぶ適当なので…
03:24 (niha) ヒー
structを追加すれば直せます。
for__!(T) for_(T)(out T t){ for__!(T) f; f.ptr_ = &t; return f; } struct for__(T){ T* ptr_; for___!(T) in_(T[] ary ...){ for___!(T) f; f.ptr_ = ptr_; f.ary_ = ary; return f; } } struct for___(T){ T* ptr_; T[] ary_; void opCall(void delegate()[] stats ...){ foreach (T t; ary_){ *ptr_ = t; foreach (void delegate() stat; stats){ stat(); } } } }
実にアレゲですね。