added case statement docs
This commit is contained in:
parent
2efde48331
commit
8b7edd82dd
@ -39,6 +39,16 @@ a
|
|||||||
[5 6]
|
[5 6]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
We can also deconstruct a previously defined variable:
|
||||||
|
```
|
||||||
|
[
|
||||||
|
(= Foo [a b c])
|
||||||
|
(= [A B C] Foo)
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
The above would assign `a` to `A`, `b` to `B`, and `c` to `C`.
|
||||||
|
|
||||||
### No Match
|
### No Match
|
||||||
|
|
||||||
What happens if we try to pattern match a value that doesn't match the left side?:
|
What happens if we try to pattern match a value that doesn't match the left side?:
|
||||||
@ -136,3 +146,59 @@ Pattern matching can be performed on maps as well:
|
|||||||
In the last case, the important thing is that the key is `-`. This tells the matcher
|
In the last case, the important thing is that the key is `-`. This tells the matcher
|
||||||
that you don't care about any other keys that may or may not exist. The value can be
|
that you don't care about any other keys that may or may not exist. The value can be
|
||||||
anything, but `-` seems semantically more correct imo.
|
anything, but `-` seems semantically more correct imo.
|
||||||
|
|
||||||
|
## Case
|
||||||
|
|
||||||
|
We can deconstruct and assign variables using `=`, and even test for their contents
|
||||||
|
to some degree since `=` returns either `success` or `[error nomatch]`. However
|
||||||
|
that's not very convenient. For this we have the `case` statement:
|
||||||
|
```
|
||||||
|
[
|
||||||
|
(= Foo bird)
|
||||||
|
(case Foo
|
||||||
|
bird (println "It's a bird!")
|
||||||
|
plane (println "It's a plane!")
|
||||||
|
_ (println "I don't know what it is!"))
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
In the above the output would be:
|
||||||
|
```
|
||||||
|
It's a bird!
|
||||||
|
```
|
||||||
|
|
||||||
|
`case` returns the result of whatever it matches:
|
||||||
|
```
|
||||||
|
[
|
||||||
|
(= Animal bird)
|
||||||
|
(case Animal
|
||||||
|
bird chirp
|
||||||
|
dog woof
|
||||||
|
lion roar) ; => chirp
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
`case` runs through all the different patterns in order, attempting to match on one
|
||||||
|
using an `=` on the backend. If none can be found it returns `[error nomatch]`. Since
|
||||||
|
`_` matches everything it can be used for any default statement.
|
||||||
|
|
||||||
|
Deconstruction works with `case` too:
|
||||||
|
```
|
||||||
|
(case [a b c]
|
||||||
|
[Foo c d] [foo Foo]
|
||||||
|
[Bar b c] [bar Bar]
|
||||||
|
_ baz) ; => [bar a]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Guards
|
||||||
|
|
||||||
|
What's a case statement without guards? Nothing, that's what! Instead of evaluating the statement
|
||||||
|
following the pattern, if that statement is `when` followed by a statement returning a boolean,
|
||||||
|
finally followed by the actual statement, then boolean test must evaluate to `true` or the
|
||||||
|
case is skipped. The boolean test can use variables from the pattern that was matched:
|
||||||
|
```
|
||||||
|
(case [five 5]
|
||||||
|
(Name Num) when (> Num 2) (println Name "is greater than two")
|
||||||
|
(Name Num) (println Name "is less than or equal to two")
|
||||||
|
_ (println "wut?"))
|
||||||
|
```
|
||||||
|
Loading…
Reference in New Issue
Block a user