digitalmars.D.learn - Recursive data-types
- ponce (17/17) Sep 27 2014 I'm dabbling with Scheme interpreter and ultimately I would need
- Rikki Cattermole (2/19) Sep 27 2014 Converting Function to a class. No where near ideal. But it'll work.
- ponce (4/9) Sep 27 2014 It does work! Thanks.
- thedeemon (6/15) Sep 27 2014 Interesting, I didn't expect this to work...
- H. S. Teoh via Digitalmars-d-learn (6/26) Sep 27 2014 [...]
- ponce (3/4) Sep 27 2014 Atom[] seems simpler to me.
- Meta (16/34) Sep 27 2014 You can also use a pointer to a Function. Basically, any
- ponce (2/4) Sep 27 2014 That's indeed what I want.
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?
Sep 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.
Sep 27 2014
On Saturday, 27 September 2014 at 11:40:19 UTC, Rikki Cattermole wrote:It does work! Thanks. Actually it's quite appropriate to make it a reference type.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.
Sep 27 2014
On Saturday, 27 September 2014 at 11:40:19 UTC, Rikki Cattermole wrote: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.htmlThese 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.
Sep 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.
Sep 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.
Sep 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.
Sep 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.
Sep 27 2014









"ponce" <contact gam3sfrommars.fr> 