Andrei Alexandrescu wrote: > Denis Koroskin wrote: >> On Fri, 17 Apr 2009 18:24:04 +0400, Steven Schveighoffer >> <schvei...@yahoo.com> wrote: >> >>> On Fri, 17 Apr 2009 09:44:09 -0400, Leandro Lucarella >>> <llu...@gmail.com> wrote: >>> >>>> I don't fully understand the example though. In writefln((v.qq = 5).i), >>>> how is that B.i is assigned to 5 if the opDotExp("qq", 5) don't >>>> propagate >>>> the 5 to the new B()? >>> I think it translates to >>> >>> opDotExp("qq") = 5 >>> >>> Without knowing the signature of qq, how is the compiler supposed to >>> infer that it is a property? In fact, I think this might be a >>> limitation of this syntax, you can't define dynamic properties. >>> >>> I for one, can't really see a huge benefit, but then again, I don't >>> normally work with dynamic-type langauges. It looks to me like a >>> huge hole that the compiler will ignore bugs that would have been >>> caught if the methods were strongly typed: >>> >>> class c >>> { >>> void opDotExp(char[] methodname,...) >>> { >>> if(methodname == "mymethod") >>> callMyMethod(); >>> else >>> throw new Exception("bad method name: " ~ methodname); >>> } >>> } >>> >>> void foo(c myc, bool rarelySetToTrue) >>> { >>> if(rarelySetToTrue) >>> myc.mymethud(); // compiles, will throw runtime exception >>> } >>> >>> Also, how do you overload the return value? Using this proposal, >>> you can't have different dynamic methods that return different types. >>> >>> -Steve >> >> Here is how it could be done: >> >> class C >> { >> auto opDot(string methodName, T... args)(T args) // opDotExp >> renamed to opDot >> { >> static if (methodName == "length") { >> return _length; // return type is size_t >> } else static if (methodName == "resize") { >> _resize(args); // return type is void >> } >> } >> } >> >> This is a great use-case for compile-time "static switch". Can we haz >> one, please? > > I think the more urgent need is for static loops. At least we have a > simple workaround for static switch. > > Andrei
Static loops are simple, at least in functions. import std.stdio; template Tuple(T...) { alias T Tuple; } template Repeat(T, int I) { static if (!I) alias Tuple!() Repeat; else alias Tuple!(T, Repeat!(T, I-1)) Repeat; } void main() { foreach (i, bogus; Repeat!(void, 15)) writefln(i); }