"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; }
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
done, this was DIP 1009, https://raw.githubusercontent.com/dlang/DIPs/master/DIPs/accepted/DIP1009.md