On 6/9/15 8:59 AM, Brian Rogoff wrote:
On Tuesday, 9 June 2015 at 15:28:16 UTC, 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?

Yes, I'm interested. As a practical example, how would you represent a
JSON AST type, which might look something like this in OCaml (type json
at the top)

   http://mjambon.com/yojson-doc/Yojson.Safe.html

using Algebraic? And once you've encoded it using Algebraic, how do you
operate on it, for example, how would you write a 'toString' on the AST?
These are both straightforward in OCaml (the straightforward yet
inefficient toString pracitically writes itself from the definition, the
efficient version with buffers is only a little more involved) so a D
version would be a good test.

Excellent example! Here's a shot:

alias JsonPayload = Algebraic!(
    bool,
    double,
    long,
    string,
    This[],
    This[string]
);

I notice that in Ocaml you get to give names to fields, so I added https://issues.dlang.org/show_bug.cgi?id=14670 to investigate the matter.

Converting a complex JsonPayload to string can be done with relative ease by using visitation.


Thansk,

Andrei

Reply via email to