Hacker News new | ask | show | jobs
by thinkpad20 3831 days ago
One advantage I could see of Rust over D for language stuff is sum types (enums in Rust). So for example you can write:

    enum MyLanguage {
      Var(String),
      Int(i32),
      Sum(Box<MyLang>, Box<MyLang>),
      Let(String, Box<MyLang>, Box<MyLang>)
    }
(Apologies if I got a few things wrong; I just mean the general idea)

Seems like without a construct like this, you'd have to use subclasses or something similar, which (to me) isn't quite as nice.

3 comments

There's std.variant in D which provides type-safe sum types.

alias MyLanguage = VariantN!(<insert types here>);

Like others said, this can be done as a library type in D: http://p0nce.github.io/d-idioms/#Recursive-Sum-Type-with-mat...

edit: not that it proves anything, just that "it can eventually be done".

Can you name the variants to distinguish two variants which "carry" the same types? It wouldn't be as useful if you can't express something like:

    enum ConnState {
        Disconnected,
        Connecting,
        Connected(net::TcpSocket),
        Transferring(net::TcpSocket),
     }
I would probably do it like this in D (disclaimer: I haven't tested this code!)

  import std.typecons;
  import std.socket;
  import std.variant;

  struct Disconnected {}
  struct Connecting {}

  alias Connected = Typedef!(TcpSocket, null, "connected");
  alias Transferring = Typedef!(TcpSocket, null, "transferring");

  alias ConnState = Algebraic!(Disconnected, Connecting, Connected, Transferring);
You could use plain structs instead of the typedef template for the same result.
I see what you mean.

You can create such new types with std.typecons.Typedef https://dlang.org/phobos/std_typecons.html#.Typedef

Though it's less pretty.

Yeah, tagged unions and the pattern matching make things so much nicer. I love a lot of things about Rust, it's got a lot of things right.