On Saturday, 27 September 2014 at 11:26:33 UTC, ponce wrote:
I'm dabbling with Scheme interpreter and ultimately I would need to declare the following types.

--------------

struct Function
{
    Environment env;
    Atom params;
    Atom body_;
}

// An atom is either a string, a double, a symbol, a function or a list of atoms alias Atom = Algebraic!(string, double, Symbol, Function, This[]);

--------------

These definitions can't work since Function and Atom need each other in this recursive definition.

How to get out of this trap?
Do I have to drop Algebraic and go back to manual tagged unions?

You can also use a pointer to a Function. Basically, any indirection will solve this problem, whether it be via class or pointer.

struct Function
{
    Environment env;

    //Either do this:
    Atom* params;
    Atom* body_;
}

//Or this                                       //Now a pointer
alias Atom = Algebraic!(string, double, Symbol, Function*, This[]);

Also, you might want to use This* instead of This[], unless you want an Atom to be able to contain a whole array of other atoms.

Reply via email to