static code generation
js.mdnq
js_adddot+mdng at gmail.com
Sun Dec 16 14:59:55 PST 2012
On Sunday, 16 December 2012 at 15:34:34 UTC, Philippe Sigaud
wrote:
>> 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.
>>
>
> Usually, given types A and B, A+B means `A or B` (in D,
> std.typecons.Algebraic!(A,B) ) and A*B means the tuple
> containing A and B
> (in D, std.typecons.Tuple!(A,B) ).
>
>
> What you're trying to do is doable in D, but you'd have to
> define it a bit
> more:
>
> if we have
>
> struct A { int a; int b}
> struct B { int b; int a} // just a and b swapped.
>
> What is `A+B`? `A-B`?
(Thanks for the typeof(this) works great!)
Yes, A+B = A or B. Or is inclusive though.. and "overlap" and
order is immaterial.
So `A+B` is equivalent to
struct ApB { int a; int b; }
Since order ultimately matters(the layout of the struct in
memory) we could define
`B+A` =
struct BpA { int b; int a; }
`A-B` = `B-A` = (only in this case)
struct AmB { } = struct BmA { }
So A*B = std.typecons.Algebraic!(A,B) which is what I initially
said * should be. That should take care of that operation. How do
you do the other ops?
More information about the Digitalmars-d-learn
mailing list