Wouldn't it be better if we had some kind of compile-time block statement instead of making separate compile-time keywords for every run-time keyword?
For example, we could reuse static, and instead of code like this from std.range: private template MostDerivedInputRangeImpl(R) { private alias ElementType!R E; static if(isRandomAccessRange!R) { static if(isInfinite!R) { alias RandomAccessInfinite!E ret; } else static if(hasAssignableElements!R) { alias RandomFiniteAssignable!E ret; } else { alias RandomAccessFinite!E ret; } } else static if(isBidirectionalRange!R) { static if(hasAssignableElements!R) { alias BidirectionalAssignable!E ret; } else { alias BidirectionalRange!E ret; } } else static if(isForwardRange!R) { static if(hasAssignableElements!R) { alias ForwardAssignable!E ret; } else { alias ForwardRange!E ret; } } else { static if(hasAssignableElements!R) { alias InputAssignable!E ret; } else { alias InputRange!E ret; } } } We would have this: private template MostDerivedInputRangeImpl(R) { private alias ElementType!R E; static { if(isRandomAccessRange!R) { if(isInfinite!R) { alias RandomAccessInfinite!E ret; } else if(hasAssignableElements!R) { alias RandomFiniteAssignable!E ret; } else { alias RandomAccessFinite!E ret; } } else if(isBidirectionalRange!R) { if(hasAssignableElements!R) { alias BidirectionalAssignable!E ret; } else { alias BidirectionalRange!E ret; } } else if(isForwardRange!R) { if(hasAssignableElements!R) { alias ForwardAssignable!E ret; } else { alias ForwardRange!E ret; } } else { if(hasAssignableElements!R) { alias InputAssignable!E ret; } else { alias InputRange!E ret; } } } } Or maybe use a different name for a compile-time block to not conflict with static. On Fri, Aug 27, 2010 at 2:42 AM, bearophile <bearophileh...@lycos.com> wrote: > > Steps toward a static foreach > (just the first point is enough for now) > http://d.puremagic.com/issues/show_bug.cgi?id=4085