On Monday, 5 August 2013 at 06:28:12 UTC, luminousone wrote:
perhaps a more generic solution should be looked at, extend
contracts to work with all scope blocks.
switch(somenumber)
in {
... before stuff ...
}
out {
.... after stuff ...
}
body {
case 1:
in {
... etc ....
}
out {
... more etc ...
}
body {
...
}
case 2:
// and so on
}
or perhaps
for( int i = 0 ; i < 10 ; i ++ )
in {
assert( i == 0 );
}
out {
assert( i == 9 );
}
body {
... stuff ...
}
if it is desired for a particular contract block to be called
in release builds perhaps a attribute label to mark it as a
runtime block or something similar.
foreach( i, k ; somerange )
@runtime in {
...
}
body {
}
Please do not take offense, but I do not see this as a good idea.
Contracts have a very different function; not just in D, but
every language that uses them. The idea is to support
design-by-contract programming. Overloading the constructs for
the purposes proposed here would, in my opinion, cause confusion
and/or weaken the proper use of contract programming.
The code in the contract conditions should never do anything more
than what is necessary to specify the contract. It should not do
explicit IO (other than implied by assert()), mutate state, or
anything like that.
At the bottom of this page you can find a reading list for more
info.
http://www.digitalmars.com/d/dbc.html
Or for a general overview:
http://en.wikipedia.org/wiki/Design_by_contract
Walter, does the D compiler or any of it's companion tools do any
static analysis on the contracts? Such as a void safety/null
reference check?