Thread overview
Recursive data-types
Sep 27, 2014
ponce
Sep 27, 2014
Rikki Cattermole
Sep 27, 2014
ponce
Sep 27, 2014
thedeemon
Sep 27, 2014
H. S. Teoh
Sep 27, 2014
ponce
Sep 27, 2014
Meta
Sep 27, 2014
ponce
September 27, 2014
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?
September 27, 2014
On 27/09/2014 11:26 p.m., 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?

Converting Function to a class. No where near ideal. But it'll work.
September 27, 2014
On Saturday, 27 September 2014 at 11:40:19 UTC, Rikki Cattermole wrote:
>> How to get out of this trap?
>> Do I have to drop Algebraic and go back to manual tagged unions?
>
> Converting Function to a class. No where near ideal. But it'll work.

It does work! Thanks.
Actually it's quite appropriate to make it a reference type.

September 27, 2014
On Sat, Sep 27, 2014 at 11:26:31AM +0000, ponce via Digitalmars-d-learn 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.
[...]

What about using Atom*[] instead of Atom[]?


T

-- 
Microsoft is to operating systems & security ... what McDonalds is to gourmet cooking.
September 27, 2014
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.
September 27, 2014
On Saturday, 27 September 2014 at 14:08:18 UTC, H. S. Teoh via Digitalmars->
> What about using Atom*[] instead of Atom[]?
>

Atom[] seems simpler to me.

September 27, 2014
On Saturday, 27 September 2014 at 15:45:20 UTC, Meta wrote:
>
> 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.

That's indeed what I want.

September 27, 2014
On Saturday, 27 September 2014 at 11:40:19 UTC, Rikki Cattermole wrote:

>> 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?
>
> Converting Function to a class. No where near ideal. But it'll work.

Interesting, I didn't expect this to work...
Got a longer workaround using some category theory and higher kinded types:
http://www.infognition.com/blog/2014/recursive_algebraic_types_in_d.html