On Thursday, 10 March 2016 at 21:07:09 UTC, FatalCatharsis wrote:
I am very new to D so I apologize if I'm very uninformed. I'm learning D by porting a big (awful) c++ project to D so that I may take advantage of all the lovely testing and QA features. I am currently moving a class over that I have which represents a 2 float vector and I've run into a problem with contracts. Here is a short excerpt:
...

The most "elegant" solution I can think of is to move the contracts into the body of the function itself and wrap them in version(unittest) or version(assert). The pre-contract would be placed at the very start of the function and the post-contract would be wrapped in a scope(exit) or scope(success).

Regarding your proposal, I don't think it's necessary to introduce new syntax; a simple change in semantics would suffice. If we simply preserved the body of the pre-contract and made it accessible in the post-contract, then your example would work as is.

I'm not sure how the compilers translate the contracts into code, but it's definitely feasible. Code of the form:

    auto foo()
    in{ ... }
    out(result){ ... }
    body{ ... }

Could simply be rewritten as:

    auto foo()
    {
        // paste pre-contract here

        auto bodyOfFoo()
        {
            // paste body here
        }

        auto result = bodyOfFoo();

        // paste post-contract here

        return result;
    }

Reply via email to