Communicating between in and out contracts

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Fri Oct 16 07:07:29 PDT 2009


Walter Bright wrote:
> Rainer Deyke wrote:
>> Andrei Alexandrescu wrote:
>>> Eiffel offers the "old" keyword that refers to the old object in a
>>> postcondition. But it seems quite wasteful to clone the object just to
>>> have a contract look at a little portion of the old object.
>>
>> You don't need to clone the whole object.  You just need to cache the
>> properties that are used with 'old'.
> 
> That's a good idea.

Should work, but it has more than a few subtleties. Consider:

class A {
     int fun() { ... }
     int gun(int) { ... }

     int foo()
     in {
     }
     out(result) {
         if (old.fun())
            assert(old.gun(5));
         else
            assert(old.fun() + old.gun(6));
         foreach (i; 1 .. old.fun())
            assert(gun(i * i));
     }
     ...
}

Now please tell what's cached and in what order.


Andrei



More information about the Digitalmars-d mailing list