June 18, 2013 [Issue 10396] New: Optional, simplified syntax for simple contracts | ||||
---|---|---|---|---|
| ||||
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 --- Comment #0 from Tommi <tommitissari@hotmail.com> 2013-06-17 18:20:47 PDT --- "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: ------- |
June 19, 2013 [Issue 10396] Optional, simplified syntax for simple contracts | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tommi | 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 --- Comment #1 from Marco Leise <Marco.Leise@gmx.de> 2013-06-19 13:00:50 PDT --- 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: ------- |
Copyright © 1999-2021 by the D Language Foundation