Self-referential tuples?

Timon Gehr via Digitalmars-d digitalmars-d at puremagic.com
Tue Jun 9 16:51:18 PDT 2015


On 06/10/2015 01:43 AM, Idan Arye wrote:
> 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.
>

Exactly. Probably it was confusing that I used a raw pointer and not 
some kind of NonNull!T hack. Non-null was the intention.


More information about the Digitalmars-d mailing list