模式匹配支持任意的racket值,这正正正表达式匹配不同,regexp-math
只能支持正则表达式和字符序列或比特序列比较。
(match target-expr
[pattern expr ...+] ...)
匹配形式取到target-expr
的结果,然后按顺序匹配每一个模式。如果匹配成功,它将执行相应的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能被用来创建模式匹配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)
网友评论