forを作ろう!

果てしなく楽しくない上に動かないよ!

import std.c.stdio;

struct for_{
    static for_init opCall(void delegate()[] init ...){
        for_init f;
        f.init_ = init;
        return f;
    }
}

struct for_init{
    void delegate()[] init_;
    for_test opCall(bool delegate() test){
        for_test f;
        f.init_ = init_;
        f.test_ = test;
        return f;
    }
}

struct for_test{
    void delegate()[] init_;
    bool delegate() test_;
    for_inc opCall(void delegate()[] incs ...){
        for_inc f;
        f.init_ = init_;
        f.test_ = test_;
        f.incs_ = incs;
        return f;
    }
}

struct for_inc{
    void delegate()[] init_;
    bool delegate() test_;
    void delegate()[] incs_;
    void opCall(void delegate()[] stats ...){
        foreach (void delegate() init; init_){
            init();
        }
        while (test_()){
            foreach (void delegate() stat; stats){
                stat();
            }
            foreach (void delegate() inc; incs_){
                inc();
            }
        }
    }
}

void main(){
    for_(int i = 0)(i < 4)(i++)(
        printf("%d", i)
    );
}

"(int i = 0)"が関数の引数の部分とかそういうのと被っててコンパイラが誤った解釈するんじゃないかな、と。
追記:普通に式じゃないので無理…
そんなわけで、

int i;
for_(i = 0)(i < 4)(i++)(
    printf("%d", i)
);

とかすれば動くんですが、それって意味ないよね…という切なさ。"{int i = 0;}"とかも駄目でした。iのスコープが違ってきてしまうので。
あと実装方法がダサい…
追記:for_はstructじゃなくていいなあ…