if書き直し

あんまりひどいので書き直した…

struct if_set{
    bool delegate() cond_;
    void delegate()[] stats_;
}

struct if__{
    bool delegate() temp_;
    if_set[] sets_;

    if__ then_(void delegate()[] stats ...){
        if_set set;
        set.cond_ = temp_;
        set.stats_ = stats;
        sets_ ~= set;
        return *this;
    }

    if__ else_if_(bool delegate() cond){
        temp_ = cond;
        return *this;
    }

    if__ else_(void delegate()[] stats ...){
        if_set set;
        set.cond_ = true;
        set.stats_ = stats;
        sets_ ~= set;
        return *this;
    }

    void end_(){
        foreach (if_set set; sets_){
            if (set.cond_()){
                foreach (void delegate() stat; set.stats_){
                    stat();
                }
                break;
            }
        }
    }
}

if__ if_(bool delegate() cond){
    if__ i;
    i.temp_ = cond;
    return i;
}

若干まともなコードに。
ただ、これだと

if_(x == 0).then_(
    printf("0\n")
).else_if_(x == 1).else_if_(x == 2).then_(
// ).else_if_(x == 2).then_( と同じ
    printf("1?\n")
).end_;

とか平気で書けるのですごく嫌なのですが、おかしな文法で書けない様にするためには、構造体をさらに二つ増やさないといけなくて、それも嫌というか、どうでもいいというか…
めんどくさいんだ!
そんなめんどくさいコードはこちら↓

struct if_set{
    bool delegate() cond_;
    void delegate()[] stats_;
}

struct if__{
    bool delegate() temp_;
    if_set[] sets_;

    if___ then_(void delegate()[] stats ...){
        if_set set;
        set.cond_ = temp_;
        set.stats_ = stats;
        if___ i;
        i.sets_ = sets_ ~ set;
        return i;
    }
}

struct if___{
    if_set[] sets_;

    if__ else_if_(bool delegate() cond){
        if__ i;
        i.sets_ = sets_;
        i.temp_ = cond;
        return i;
    }

    if____ else_(void delegate()[] stats ...){
        if_set set;
        set.cond_ = true;
        set.stats_ = stats;
        if____ i;
        i.sets_ = sets_ ~ set;
        return i;
    }

    void end_(){
        foreach (if_set set; sets_){
            if (set.cond_()){
                foreach (void delegate() stat; set.stats_){
                    stat();
                }
                break;
            }
        }
    }
}

struct if____{
    if_set[] sets_;

    void end_(){
        foreach (if_set set; sets_){
            if (set.cond_()){
                foreach (void delegate() stat; set.stats_){
                    stat();
                }
                break;
            }
        }
    }
}

if__ if_(bool delegate() cond){
    if__ i;
    i.temp_ = cond;
    return i;
}