On 02/20/2015 02:32 PM, Vlad Levenfeld wrote:
I'd like to do something like this:

   @reflexive @transitive bool relation (T)(T a, T b)
   out (result) {
     mixin(property_verification!result);
   }
   body {
     ...
   }

which becomes

   out (result) {
      // generated from @reflexive
     assert (result == skip_contract!relation (b,a));

     // generated from @transitive
     static typeof(result) c;
     if (result)
       assert (skip_contract!relation (b,c) == skip_contract!relation
(a,c));
     c = b;
   }

or something like that. I don't see a way to get exactly this, but does
anyone have any thoughts on something similar?

Apparently, __FUNCTION__ is valid in an out block:

import std.stdio;
import std.string;

struct reflexive
{}

struct transitive
{}

string property_verification(alias var)(string func = __FUNCTION__)
{
    return format(
        `writefln("We are in %s; and the value of '%s' is '%%s'.", %s);`,
        func, var.stringof, var.stringof);
}

@reflexive @transitive bool relation (T)(T a, T b)
out (result) {
    mixin(property_verification!result);

} body {
    return false;
}

void main()
{
    int a, b;
    relation(a, b);
}

The output printed inside the out block:

We are in deneme.relation!int.relation; and the value of 'result' is 'false'.

Ali

Reply via email to