Self-referential struct mixins
Claude
claudemr at live.fr
Sun Nov 17 09:16:19 UTC 2019
On Sunday, 17 November 2019 at 07:13:52 UTC, rbscott wrote:
> Hello,
>
> I recently started using D, and I am exploring some of the
> functionality in CTFE. I ran into a case that I can't get past.
> The goal is to take a JSON API Schema and convert it into D
> types using CTFE. The problem is, the types can be
> self-referential.
>
> A simplified form of the language would look like:
>
> { "A" : { "type": struct, "fields" : { "b": { "type": "string"
> }, "a" : { "type": "A" }}}
>
> This would yield a type "A" that has two fields, "a" and "b".
> Where "a" is a string and "b" is of type "A". Or in D:
>
> struct A {
> string b;
> A* a;
> }
>
> This is a simplified example, but imagine this is highly nested
> to generate arbitrarily complex types that could reference on
> one another.
>
> I got this working in the simple case if none of the fields are
> self-referential, but it breaks as soon as there is a loop.
>
> Here is a gist which demonstrates the issue:
> https://gist.github.com/rbscott/ee0f3ba94296f9c8224a8c4c13c2f026.
>
> I think I can workaround this by with string mixins everywhere,
> but the structure generation logic is complex enough that I
> would prefer not to do that. This approach could be totally
> off, so any suggestions would be greatly appreciated!
>
> thanks,
> rbscott
But "a" is not strictly of type A, but rather A*, which makes a
big difference.
Anyway, upon the mixin template instantiation, you can try to
'declare' all your struct's on top and then properly 'define'
them afterwards:
struct A;
struct B;
struct A {
B* b;
}
struct B {
A* a;
}
Have you tried that?
More information about the Digitalmars-d
mailing list