On Tuesday, 20 March 2012 at 21:28:25 UTC, Jacob Carlborg wrote:
On 2012-03-20 19:25, Mantis wrote:
Hello,

since people discussed a lot about user-defined attributes recently, I've been thinking about a way to implement it with a string mixins. The problem with them is their syntax - it's far from what we want to use in everyday job. I understand, they should be easily distinguished at use site, but perhaps this may be accomplished in other ways as well. My
idea is to translate this kind of statements:

# identifier statement

into this:

mixin( identifier( q{ statement } ) );


I don't like it. I want real user defined attributes.

I think the idea has merit, string mixins together with CTFE parsing is the holy grail... because of the current syntax it's not really feasible to use on a per-member basis... but it is possible to use on a struct/class basis...

mixin(attr(q{struct Foo
{
  @NonSerialized int x;
  @NonSerialized int y;
  int z;
}}));

Please disregard my broken parser(it's just a proof of concept)
However, consider what we could do with the latest CTFE parser advances,
coupled with a tighter compiler/library callback interface.
====================================================================

import std.stdio;
import std.array;
import std.string;
import std.algorithm;

string attr(string complex_decl)
{
  string org_struct;
  string ser_struct;

  auto lines = splitLines(complex_decl);

  {
    auto decl = split(stripLeft(lines[0]));

    if(decl[0]=="struct")
    {
      org_struct = decl[0] ~ " " ~ decl[1];
      ser_struct = decl[0] ~ " " ~ decl[1] ~ "_Serializable";
    }
    else
      return complex_decl;
  }

  foreach(line; lines[1..$])
  {
auto attr = findSplitAfter(stripLeft(line), "@NonSerialized ");

    if(attr[0]=="@NonSerialized ")
      org_struct ~= attr[1];
    else
    {
      org_struct ~= attr[1];
      ser_struct ~= attr[1];
    }
  }

  return ser_struct ~ "\n" ~ org_struct;
}

mixin(attr(q{struct Foo
{
  @NonSerialized int x;
  @NonSerialized int y;
  int z;
}}));

void main()
{
  auto m = [ __traits(allMembers, Foo) ];
  writeln("Normal members of Foo:", m);

  auto n = [ __traits(allMembers, Foo_Serializable) ];
  writeln("Serializable members of Foo:", n);
}

Reply via email to