On Tuesday, 9 June 2015 at 23:04:41 UTC, Andrei Alexandrescu wrote:
On 6/9/15 3:58 PM, Timon Gehr wrote:
On 06/09/2015 05:28 PM, Andrei Alexandrescu wrote:
Following the use of This in Algebraic
(https://github.com/D-Programming-Language/phobos/pull/3394), we can
apply the same idea to Tuple, thus allowing one to create
self-referential types with ease.

Consider:

// A singly-linked list is payload + pointer to list
alias List(T) = Tuple!(T, This*);

// A binary tree is payload + two children
alias Tree(T) = Tuple!(T, This*, This*);
// or
alias Tree(T) = Tuple!(T, "payload", This*, "left", This*, "right");

// A binary tree with payload only in leaves
alias Tree2(T) = Algebraic!(T, Tuple!(This*, This*));

Is there interest in this? Other application ideas to motivate the
addition?


Andrei

Well, the issue is with this kind of use case:

alias List(T)=Algebraic!(Tuple!(),Tuple!(T,This*));

So a list is either nothing, or a head and a tail. What is the problem here? -- Andrei

The `This*` here is not mapped to `Algebraic!(Tuple!(),Tuple!(T,This*))` - it's mapped to the closest containing tuple, `Tuple!(T,This*)`. This means that the tail is not a list - it's a head and a tail. The list is either empty or infinite.

At any rate, I think this feature is useful enough even if it doesn't support such use cases. You can always declare a list as a regular struct...

Reply via email to