I’m making a language with a lot of inspiration from rust and was experimenting with alternative enum syntax. It relies on literals to be types in order to convey information on the different options.
I don’t really get on well with Typescript but having the ability to use literals as types is something I really liked as a lot of the times I use static string literals as errors. and having all the variants upcast through types makes it easier to do pattern matching.
Plain-text transcription of the image:
// using rust like enum syntax
Option<T> (
| "Some" T
| "None"
)
fn match_demo() {
let some_option = Option "Some" "text";
let none_option = Option "None";
match some_option {
"Some" "hello" => print("oh hi there"),
"Some" text => print("Option is {text}"),
"None" => print("Option is {text}"),
}
}
// Or maybe more experimental syntax
Option<T> (
| T
| ()
)
fn match_demo2() {
let opt = Option "something";
match opt {
"text" => "matching directly",
var => "bind to variable",
() => "nothing",
}
}
Yeah I think you’ve made it worse than Rust in both cases. They clearly shouldn’t be strings. And the second option is just unnecessarily confusing.
The second syntax isn’t actually enums at all, it’s closer to a union type definition. You can’t even define
enum Colour = Red | Green | Blue
using your second syntax.