On Sunday, 8 February 2015 at 17:12:20 UTC, Daniel Murphy wrote:
"Zach the Mystic" wrote in message news:qxtyqdeewrjurmwhk...@forum.dlang.org...

I don't know how the second assert could men somethign different from the first. If you assert (anything but assert(0)) first thing, you certainly are not checking for bugs *within* the function - you're checking for entry conditions. So the question is whether the practical difference between the two asserts above is sufficient to prevent applying the syntax sugar. I personally can live with it either way (I can handle being told the the function failed when it was really the caller that failed), but it's a judgment call. I mean, this thread was literally called "Another idiom I wish were gone from phobos/druntime." I don't expect it is the last time someone will complain about it.

Here's one:

struct S
{
private:
   static int instanceCount;

...

public:
   void func(int x)
   in
   {
       assert(x >= 0, "can't call func with negative x");
   }
   body
   {
       assert(instanceCount > 0);
   }
}

The first assert checks something the caller has control over, the second assert is a sanity check, and if it fails it's not an error in the caller.

Well, okay. This is a case where there is a slight practical difference. In the spirit of keeping the rare case possible, I would suggest:

   body
   {
       {} // reject in-contract assert
       assert(instanceCount > 0);
   }

Anyway, IMO there is zero chance of this making it into the language and you're wasting your energy.

That's disappointing, but I didn't waste my energy. I realized there's validity to both sides of this argument (bulky contracts vs. accurate errors), and instead of choosing a side, I tried to come up with the biggest total win for both sides. I think my solution is a 80-90% win for both sides, which is better than 100-0% for just one. If it gets rejected for some other reason, so be it. I'm trying to help, here!

Reply via email to