-
Notifications
You must be signed in to change notification settings - Fork 4
Description
Right now we have one match syntax which can be used as an expression or statement.
When used as a statement not in return position, we allow the branches to have different types. See these tests for examples: https://github.com/fir-lang/fir/blob/eb2236a27a1730af97e7f17b0ddb1f1114c44fa3/tests/IfMatchStmtChecking.fir
In both exprs and stmts though we check exhaustiveness, and in runtime, if the expr or stmt doesn't match the scrutinee the interpreter panics.
I think in statement for we could allow not being exhaustive, i.e. add an implicit _: () at the end of every non-exhaustive match statement.
However a concern is that we'll have the same syntax for two things that work quite differently. So maybe a new keyword would be useful for the statement form, maybe switch.
Syntax-wise everything else other than the keyword should be the same.
The use case is similar to if let Some(x) = ... { ... } in Rust, in code like
Lines 109 to 115 in cd69304
| match extension: | |
| Option.None: () | |
| Option.Some(extension): | |
| if fields.len() == 0: | |
| doc = Doc.str("..") | |
| else: | |
| doc += Doc.str(", ..") |
Here ideally I want to be able to omit the Option.None case. With switch it would look like this:
switch extension:
Option.Some(extension):
if fields.len() == 0:
doc = Doc.str("..")
else:
doc += Doc.str(", ..")
When we have just one branch Rust style if let can be more concise:
if let Option.Some(extension):
if fields.len() == 0:
doc = Doc.str("..")
else:
doc += Doc.str(", ..")
And if we add if let, we can add it in full generality (allow in conjunctions) which would make statement switch mostly redundant.
So maybe we just want if let?