request switch statement with common block

ron rd.hunt at gmail.com
Mon Aug 5 12:58:19 PDT 2013


On Monday, 5 August 2013 at 08:46:54 UTC, Andre Artus wrote:
> 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?

None taken, =-p.

I don't see how this is different from current contract usage, 
right now they apply to function scopes only. currently I believe 
you could get a similar effect via using an inner function.

void a() {
    int i = 0;
    void b()
    in {
       assert( i == 0 );
    }
    out {
       assert( i == 10 );
    }
    body {
       for( ; i < 10 ; i ++ ) {
          ... do something ...
       }
    }
    b();
}


More information about the Digitalmars-d mailing list