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();
            }
        }
    }
}

実にアレゲですね。