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);
}