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",
}
}
Use a keyword, it’ll make your life a lot easier for parsing. If you’re reluctant on using “enum” as a keyword, you should check out OCaml/ML’s “type” keyword (they are the exact same contept: ADTs, but rust weirdly associates them with enums)
Don’t use magic strings! Not only is this hard to check for errors while writing code, you also can’t tell easily if it is a normal string, or an enum.
In my old project, my syntax looked like this:
// Flavour and vec of ingredients type Food[T] { | Pizza str, vec[T] | Cake str, vec[T] | Soup vec[T] }
not only is this easy to parse, i’d say it sticks true to its ML roots. You should check odin’s enum syntax if you’re keen on making a unique syntax.