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