# What's difference between case and match?

by user8314628   Last Updated December 06, 2018 15:26 PM - source

I was confusing about the difference between `match` and `case`. In the document， it mentions that `match` supports general pattern matching.

``````> (define (m x)
(match x
[(list a b c)
#:when (= 6 (+ a b c))
'sum-is-six]
[(list a b c) 'sum-is-not-six]))
> (m '(1 2 3))
'sum-is-six

> (m '(2 3 4))
'sum-is-not-six
``````

For this example, I thought I could rewrite it using `case` expression. But seems it's quite complicated. I have to get the length of the input `x`, and maybe a lambda function to get the sum of the elements of `x` and compare it with `6`.

So I guess we prefer `match` when doing pattern matching. Is it true? Any difference other than that?

Tags :

You said it yourself, `match` does pattern matching whereas `case` only checks if a value belongs in one of several lists of possible values.

All that `case` does is syntax sugar for a `cond` with multiple conditions, for example:

``````(case (+ 7 5)
[(1 2 3) 'small]
[(10 11 12) 'big]
[else 'other])
``````

... is equivalent to:

``````(let ((val (+ 7 5)))
(cond ((or (equal? val 1) (equal? val 2) (equal? val 3))
'small)
((or (equal? val 10) (equal? val 11) (equal? val 12))
'big)
(else 'other)))
``````
Óscar López
December 06, 2018 15:25 PM