Re: Type checking and compatibility
FWIW, and that's probably not much, I prefer "bool flag := <bool expression>". It is a useful redundancy that ensures that the (potentially hard to read) expression is of the type that the author and later reader think it should be. While this is not a big deal for bool, it can be a big deal for numeric types or for references (how many C bugs occur because something is a pointer to a pointer, rather than just a pointer?)
Also FWIW my own language project [actually a pre-processor to Go since they won't add it to the language] goes even further with compile-time checking. It allows the programmer to define named types, much like any language, and then also "compound types", or as I call them, dimensions. For example, in C-ish pseudo-code it might look something like...
type Meters double;
type Seconds double;
type Velocity (Meters/Seconds);
And then if you have m, a variable of type Meters, s of type seconds, and v or type velocity, you can write:
v = m/s;
or
m = v*s;
but not
v = m*s; //wrong dimensions, failed by dimension checker even though underlying types are all double
The dimensions will be checked at compile time, leaving runtime code as efficient as if the dimension checker never existed.
Of course, this is a relatively trivial example. The value becomes more apparent the more complex an expression becomes, and when calculations are chained together.