static code generation

js.mdnq js_adddot+mdng at gmail.com
Sun Dec 16 00:49:09 PST 2012


On Sunday, 16 December 2012 at 06:38:13 UTC, anonymous wrote:
> On Saturday, 15 December 2012 at 16:32:27 UTC, r_m_r wrote:
>> On 12/15/2012 08:57 PM, anonymous wrote:
>>> Note that here s1alpha and s2alpha are distinct types.
>>
>> what about this: http://dpaste.dzfl.pl/95f7a74d
>
> Consider
>
> struct Foo {mixin (genStruct!("s1"));}
> struct Bar {mixin (genStruct!("s1"));}
>
> Foo.s1alpha and Bar.s1alpha are the same type. In my version 
> they are not.


Yes, they should be the same type. If you are inserting an actual 
struct with the same name("s1") then you would expect them to be 
identical. (else you could just do something like 
mixin(genStruct!("_1", "s1")); to get a different copy of the 
struct.

But we are not talking about inserting a field but "combining" 
structs.

I think the updated answer is more pertinent:

http://dpaste.dzfl.pl/d9f001db

Here we are "inserting" a struct(well, now it is simply a 
template) into another(not a struct field, different things).

struct B { int x; }
struct A { Insert(B); }

should be indentical to

struct A { int x; }

r_rm_r has parameterized it so that it's really A!(B) which is 
better so we can combine them in many ways.

What all this is analogous to is multiple inheritance at compile 
time. A inherits B, so to speak. It is helpful in breaking down 
larges structs into smaller ones and being able to mix and match.

One could also think of it as an algebra of structs.

It would be nice to be able to do stuff like

A + B, A - B(possibly useless), A*B(possibly useless), etc...

A + B would just combine the members, A - B could remove the 
members that overlap, A*B could qualify overlapping members.

struct A
{
   int x;
   int y;
}

struct B
{
   int x;
   int z;
}

A + B <==>

struct ApB {
   int x;   // Possible error because of overlap
   int y;
   int z;
}

A - B <==>
struct AmB {
    int y;
    int z;
}

A*B <==>
struct AtB {
    int x.A;
    int x.B;
    int y;
    int z;
}

or whatever. The usefulness is mainly that you can decompose a 
struct into pieces then recombine them into something possibly 
different. I'm not interested in the algebra aspect, just the 
ability to break down into two pieces, one I supply, one the user 
of the struct supplies. A simple A + B type of operation. The 
point, is, a lot of possible with such a feature. Possibly no one 
will use it but it could be quite powerful if it was designed 
appropriately.






More information about the Digitalmars-d-learn mailing list