digitalmars.D.bugs - [Issue 10396] New: Optional, simplified syntax for simple contracts
- d-bugmail puremagic.com (47/47) Jun 17 2013 http://d.puremagic.com/issues/show_bug.cgi?id=10396
- d-bugmail puremagic.com (44/44) Jun 19 2013 http://d.puremagic.com/issues/show_bug.cgi?id=10396
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
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