www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 10396] New: Optional, simplified syntax for simple contracts

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=10396

           Summary: Optional, simplified syntax for simple contracts
           Product: D
           Version: unspecified
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: tommitissari hotmail.com



"Simple things should be simple, complex things should be 
possible." -Alan Kay

I'd like to simplify the syntax of function pre- and 
post-conditions when the contract block consists of a single 
assert statement. A special syntax for this special case would 
omit all of the following:
1) the block's curly braces
2) the assert keyword
3) the semi-colon ending the assert statement
4) the body keyword (if and only if it's right after the block)

So, instead of writing this:

int func(int i)
in
{
    assert(i < 5);
}
out(r)
{
    assert(r < 9);
}
body
{
    return i * 2;
}

...you'd be able to write this:

int func(int i)
in (i < 5)
out(r) (r < 9)
{
    return i * 2;
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 17 2013
parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=10396


Marco Leise <Marco.Leise gmx.de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |Marco.Leise gmx.de



There I fixed it: http://dpaste.1azy.net/2ec082c0 :)

--- 8< ------------------

string holds(string expr, string expl = null)
{
    import std.array : split;
    import std.string : strip;

    expr = strip(expr);
    string vars;
    bool[string] processed;
    foreach (token; split(expr)) if (token.length && token !in processed)
    {
        if (token[0] == '.' || token[0] >= 'A') {
            if (vars !is null) vars ~= ", ";
            vars ~= token ~ ` = " ~ to!string(` ~ token ~ `) ~ "`;
            processed[token] = true;
        }
    }
    if (expl) expl = " " ~ expl ~ ";";
    return `import std.conv : to; import std.array : join; import std.typetuple
: ParameterIdentifierTuple; `
        ~ `assert(` ~ expr ~ `, __FUNCTION__ ~ "(" ~
join([ParameterIdentifierTuple!(mixin(__FUNCTION__))], ", ") ~ "):` ~ expl ~ `
(` ~ expr ~ `)` ~ ` failed with ` ~ vars ~ `");`;
}

void foo(uint x, uint y)
in { mixin(q{ x > y && x < 10 }.holds("x must be a digit larger than y")); }
body {}

void main()
{
    foo(2, 3);
}

--- >8 ------------------

Prints:

foo(x, y): x must be a digit larger than y; (x > y && x < 10) failed with x =
2, y = 3

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 19 2013