4 ms·
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)
by thinkpad20 11y 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.
- felixangell1024 11y agoYeah, 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.
- jeremiep 11y agoThere's std.variant in D which provides type-safe sum types. alias MyLanguage = VariantN!(<insert types here>);
- p0nce 11y agoLike others said, this can be done as a library type in D: http://p0nce.github.io/d-idioms/#Recursive-Sum-Type-with-matching http://p0nce.github.io/d-idioms/#Recursive-Sum-Type-with-mat... edit: not that it proves anything, just that "it can eventually be done".
- tomjakubowski 11y agoCan 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), }
- jeremiep 11y agoI 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.
- p0nce 11y agoI see what you mean. You can create such new types with std.typecons.Typedef https://dlang.org/phobos/std_typecons.html#.Typedef https://dlang.org/phobos/std_typecons.html#.Typedef Though it's less pretty.