Bug 10396 – Optional, simplified syntax for simple contracts
Status
RESOLVED
Resolution
WORKSFORME
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2013-06-17T18:20:47Z
Last change time
2020-03-21T03:56:38Z
Assigned to
No Owner
Creator
Tommi
Comments
Comment #0 by tommitissari — 2013-06-17T18:20:47Z
"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;
}
Comment #1 by Marco.Leise — 2013-06-19T13:00:50Z
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