Есть два отличия:
match
намного мощнее, чем case
.У case
нет «шаблонов», как у match
, и он неявно цитирует данные в каждом «вопросе ветвления».Он сравнивает только приведенную форму данных со значением, как оператор switch.match
имеет другой и гораздо более богатый язык шаблонов.
x
в каждом вопросе ветвления этих двух примеров
(case 5
[(x) 10]
[else 'fail])
;=> 'fail
(case 'x
[(x) 10]
[else 'fail])
;=> 10
неявно цитируется как символ'x
.В терминах соответствия это эквивалентно
(match 5
['x 10]
[_ 'fail])
;=> 'fail
(match 'x
['x 10]
[_ 'fail])
;=> 10
Где цитирование является одним из многих вариантов создания шаблонов, а не по умолчанию.Если вы пропустите цитату в match
, x
больше не будет символом;это подстановочный знак, который соответствует чему-либо и определяет x
как результат.
(match 5
[x (+ x 1)])
;=> 6
Этого никогда не произойдет с case
из-за неявного цитирования case
.
case
вопросы ветвления имеют несколько данных для каждой ветви.
Эти данные должны быть заключены в скобки.
(case expr
[(datum ...) answer]
...)
Где match
имеет только один шаблон на ветку (без скобок)
(match expr
[pattern answer]
...)