with(a,b,c, ...) blocks..

Era Scarecrow rtcvb32 at yahoo.com
Wed Oct 17 00:18:42 PDT 2012


On Wednesday, 17 October 2012 at 06:07:34 UTC, ixid wrote:
>>Theoretically legal...
>>
>> void func()
>> //in/out contracts
>> body with (E) { //with replaces normal block
>>
>> }
>
> This seems sensible. Multiple with seems like a recipe for 
> confusion and member name clashes.

  True... But if you're planning on going multiple levels of with, 
then it isn't going to matter much.

  In a project of mine I'll have a few different enum types, each 
one with their own sets of flags used in a structure. So you're 
looking at something like.. As an off the wall example.

   enum OnOff {off, on}
   enum Speed {stop, slow, medium, fast, reallyFast, lightspeed}
   enum MemoryType {allocated, stack}
   enum EngineType {internalCombustion, electrical, magical, warp, 
teleportion}
   enum Size {tiny, small, medium, large, huge}

   struct Vehicle {
     OnOff state;
     Speed speed;
     const MemoryType memAt;
     const EngineType engine;
     const Size size;
   }

  So in this kind of case where none of the enums clash, then 
manually doing them. True there's a clash from size/speed, but 
that's fairly easy to fix in the case it's used.

   with (OnOff, Speed, MemoryType, EngineType, Size)
//    or
//  with (OnOff) with(Speed) with(MemoryType)
//      with(EngineType) with(Size)
   {
     Vehicle Enterprise = {off, stop, stack, warp, huge};

     //fully explicit, but doesn't buy you much except clutter
     Vehicle Enterprise2 = {OnOff.off, Speed.stop, 
MemoryType.stack,
                             EngineType.warp, Size.huge};

     //wrong order, enums complain but is fairly obvious
     //based on types (and the error message) how to reorder it.
     Vehicle ModelT = {stop, allocated, medium, 
internalCombustion, off};
   }


More information about the Digitalmars-d-learn mailing list