On Sunday, 10 August 2014 at 20:12:56 UTC, Walter Bright wrote:
On 8/10/2014 11:34 AM, Era Scarecrow wrote:
 5. Access permissions (public/private/protected).
 6. File length attributes (@safe: @system: @trusted:)

Again, that is for declarations, not statements.

 Does with have to be only for statements?

Real example. In my code somewhere i have a large list of enum types that specify a type of formatting and visibility options.

enum FlagStates {
  def        = 0x0,    //Default Value.
  changed    = 1,      ///Has changed (From original state)
  readOnly   = 1 << 1, ///This field/subrecord/record is readonly
isOriginal = 1 << 2, ///when loaded except when marked deleted/invisible
  invisible  = 1 << 3, ///
  deleted    = 1 << 4, ///
  //29 out of 32 flags are defined
 }

next i'll have a struct that holds this as part of it's declaration...

///Details for specific parts/fields
struct NotePart {
  ValueType type;  ///type of value (string, etc. See flags.d)
  string id;       ///specific output/identifier to print (If any)
  int _size;
  Flags flags;     ///default flags used. Relies on FlagStates
  //etc...
}

alias immutable(char)[4] NString;
struct SubRecordParts {
  NString name; ///specific subrecord
  NString requ; ///must be within record (or base subrecord)
int size; ///how big (Helps identify, TES3 header is 300 for example.
  NotePart[] notes; ///Specify all the individual fields
 //etc
}

Now since i can't use with(): I'm forced to do aliases, and a lot of them...

private alias NotePart NP;
private alias ValueType VT;
private alias FlagStates.noPrint noPrint;
private alias FlagStates.noChange noChange;
private alias FlagStates.hashPrint hashPrint;
private alias FlagStates.noPrintClashes noPrintClashes;
private alias FlagStates.noPrintNull noPrintNull;

//there's at least like 200 entries in here.
immutable SubRecordParts subParts[] = [
  {"DATA", "INFO", 12, [
    {VT.raw,  "Unknown", 4, Flags(noPrint, noChange)},
    {VT.i_32, "Disposition"},
    {VT.i_8,  "Rank"},
    {VT.ranged_8, "Gender"},
    {VT.i_8,  "PCRank"},
    {VT.raw,  "Unknown", 1, Flags(noPrint, noChange)}]},
  {"VHGT", "LAND", 4232, [
    {VT.float_32, "Base Height"},
{VT.raw, "Height Data", 4228, Flags(noChange, noPrintClashes, hashPrint)}]}, //etc etc. This is a more verbose section than most of the rest. Most include the noPrintNull flag
];



Had i been able to use with() i could have avoided the aliases above and probably just done a single line before using it heavily.

  with(FlagStates, ValueType):

There wouldn't have been clashing because they each hold different types of data, and it's all immutable static values anyways.

Reply via email to