On 02/04/2011 10:29 PM, bearophile wrote:
Jonathan M Davis:

assert(0) has the advantage of being a normal assertion in non-release mode.

What is this useful for? To me this looks like a significant disadvantage. If I 
want a HALT (to tell the compiler a point can't be reached, etc) I want it in 
every kind of compilation of the program.


It also makes it clear that that code path should _never_ be reached.

The replacement for assert(0) is meant to be more clear in its purpose compared 
to assert(0). It may be named thisCantHappen(), or assertZero(), etc.


The real question though is whether you can convince Walter (which I doubt, but 
I don't know).

This topic was already discussed, and I think the result of the discussion was 
that this change of assert(false) is not worth it. But if asserts gets inproved 
for other purposes, then this is a chance to work on improving assert(0) too.


Still, making such a change _would_ contradict TDPL, which is supposed to be a 
major no-no at this point.<

I like TDPL, I respect Andrei and you, I agree that TDPL is a kind of reference 
for D2, but please stop using TDPL as a The Bible in many of your posts. Not 
even Andrei himself looks so religiously attached as you to the contents of 
TDPL :-) A little flexibility is acceptable.

agreed

--------------------------

Adam Ruppe:

Again, I think this makes sense too. assert(n) is saying, in principle, "ensure n is 
valid". Calling the invariant is part of ensuring it is valid. The only problem is a 
minor bug - it forgets to check for null before calling the invariant. That should, of 
course, be fixed, but the main behavior makes sense.<

Something like class_instance.invariant() is better because:
- It's explicit and readable. While you need to read the D manual to know that 
assert(class_instance) tests the invariant too, and not just that 
class_instance reference is not null. I remember other persons in D.learn not 
knowning/suprised by that assert(class_instance) tests the invariant too.
- It removes a special case, and special cases kill languages. Struct instances 
too allow an invariant, but they are not callable with assert(), see below. A 
syntax like structlass_instance.invariant() is shared with the class one.

struct Foo {
     int x;
     invariant() { assert(x == 1); }
}
void main() {
     Foo f;
     assert(f);
}


DMD 2.051:
test.d(7): Error: expression f of type Foo does not have a boolean value

Bye,
bearophile

ditto
(implicit magic semantics is bad)

Denis
--
_________________
vita es estrany
spir.wikidot.com

Reply via email to