On Sun, Feb 5, 2012 at 12:57 PM, Timon Gehr <timon.g...@gmx.ch> wrote: > On 02/05/2012 03:53 PM, so wrote: >> >> On Sunday, 5 February 2012 at 14:24:20 UTC, Timon Gehr wrote: >> >>> This should work: >>> >>> #define DOTDOTDOT ... >>> >>> template<class T> void fun(T a){ >>> if(cond<T>::value) { >>> auto var = make(a); >>> DOTDOTDOT; >>> }else{ >>> auto tmp = make(a); >>> auto var = make_proxy(tmp); >>> DOTDOTDOT; >>> } >>> } >> >> >> It won't work. >> You now have two scopes and you have to repeat every line after "var" >> for both scopes. Now you have to maintain both of them. > > > You just maintain the macro. > > >> And this grows >> exponentially for every new condition you have. >> > > It certainly has limits. I completely agree that C++s generic programming > facilities are severely underpowered. >
What I would really like to see in D is: immutable variable = if (boolean_condition) { // initialize based on boolean_condition being true } else { // initialize based on boolean_condition being false } Scala has this and find it indispensable for functional and/or immutable programming. Yes, I have been programming with Scala a lot lately. It has a lot of problem but it has some really cool constructs like the one above. Scala also has pattern matching and structural typing but that may be asking too much ;). I am not sure what it would take to implement this in D but I am thinking we need the concept of a void type (Unit in scala). Thoughts?