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