模式匹配支持任意的racket值,這正正正表達式匹配不同移袍,regexp-math
只能支持正則表達式和字符序列或比特序列比較傻谁。
(match target-expr
[pattern expr ...+] ...)
匹配形式取到target-expr
的結果,然后按順序匹配每一個模式损痰。如果匹配成功福侈,它將執(zhí)行相應的expr序列來獲得match形式的結果。如果模式里面有變量卢未,它們被當做匹配符對待肪凛,每一個變量都會綁定到expr相應的輸入片段上面。
大部分Racket字面表達式都能被當做模式來匹配
>(match 2
[1 'one]
[2 'two]
[3 'three])
'two
>(match #f
[#t 'yes]
[#f 'no])
'no
>(match "apple"
['apple 'symbol]
["apple" 'string]
[#f 'boolean])
'string
構造函數cons,list,和vector能被用來創(chuàng)建模式匹配paris辽社,lists伟墙,和vectors
>(match '(1 2)
[(list 0 1) 'one]
[(list 1 2) 'two])
'two
>(match '(1 . 2)
[(list 1 2) 'list]
[(cons 1 2) 'pair])
'pair
>(match #(1 2)
[(list 1 2) 'list]
[(vector 1 2) 'vector])
'vector
struct構造函數也能被使用在模式匹配
>(struct shoe (size color))
>(struct hat (size style))
>(match (hat 23 'blowler)
[(shoe 10 'white) "bottom"]
[(hat 12 'bowler) "top"])
"top"
模式里非引用,非構造的標識符是模式變量滴铅,用來綁定結果表達式戳葵。除了_,不綁定任何東西,但可以匹配所有東西汉匙。
>(match '(1)
[(list x) (+ x 1)]
[(list x y) (+ x y)])
2
>(match '(1 2)
[(list x) (+ x 1)]
[(list x y) (+ x y)])
3
>(match (hat 23 'bowler)
[(shoe sz col) sz]
[(hat sz stl) sz])
23
>(match (hat 11 'cowboy)
[(shoe sz 'black) 'a-good-shoe]
[(hat sz 'bowler) 'a-good-hat]
[_ 'something-else])
'something-else
...
省略號拱烁,當在列表或者向量里面生蚁,代表省略號之前的子模式會被匹配多次。如果子模式包含一個模式變量并帶有...
邻梆,變量會被匹配多次守伸,綁定結果則是一個匹配的列表。
>(match '(1 1 1)
[(list 1 ...) 'ones]
[_ 'other])
'ones
>(match '(1 1 2)
[(list 1 ...) 'ones]
[_ 'other])
'other
>(match '(1 2 3 4)
[(list 1 x ... 4) x])
'(2 3)
>(match (list (hat 23 'bowler) (hat 22 'pork-pie))
[(list (hat sz style) ...) (apply + sz)])
45
省略號能被內嵌匹配內嵌的重復浦妄,在這種情況下尼摹,模式變臉能綁定匹配的列表組成的列表
>(match '((! 1) (! 2 2) (! 3 3 3))
[(list (list '! x ...) ...) x])
'((1) (2 2) (3 3 3))
`左單引號也能用來構建匹配。例子如下(無法理解剂娄,翻譯無奈)
>(match `{with {x 1} {+ x 1}}
[`{with {,id,rhs} ,body}
`{{lambda {,id} ,body} ,rhs}])
match-let和match-lambda支持位置模式的綁定而不是必須是標識符的綁定蠢涝。
>(match-let ([list x y z) '(1 2 30])
(list z y x))
'(3 2 1)