bearophile wrote: > Steven Schveighoffer: > >> I have code like this in dcollections: > > This is similar code that shows the same thing: > > import std.stdio; > void main() { > bool b = true; > bool c; > if (c = !b) > writeln("****"); > } > > >> Since when did bool = bool not give a bool result? > > I guess since Walter has decided to avoid in D the common bug present in C > and C++ programs caused by using = instead of == inside an if(). For the > exactly the same bug-avoidance purpose, Python too allows chained assigns: > a = b = 10 but it refuses the assign in the if: > if x = 10: ... > > >> Do I have to write it out like this: >> if((wasRemoved = !it.empty) == true) > > Yep. Or you can write it like this, also gaining readability as > side-effect: wasRemoved = !it.empty > if (wasRemoved) { ... > > In other situations you can write code like this in D: > if (bool c = !b) > > A bit of less syntactic convenience is a price worth paying for a reduced > bug-prone language that wants to keep the flavour of upwards compatibility > to C that D wants. > > >> I can understand for ints and strings and whatnot, but for booleans? > > My guess: that's a special case. Special cases kill languages (see C++), > so better to have no exceptions. Less things to remember, simpler > compiler, shorter books about D, less time to read the language. > > Bye, > bearophile
This is all true but if this is how the feature should be defined I think the error message should improve. Something along the lines of, "Assignments not allowed as thruth values in conditional statments" seems more clear.