美文网首页
12模式匹配

12模式匹配

作者: jarod_chan | 来源:发表于2016-05-20 20:28 被阅读133次

模式匹配支持任意的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)

相关文章

  • 12模式匹配

    模式匹配支持任意的racket值,这正正正表达式匹配不同,regexp-math只能支持正则表达式和字符序列或比特...

  • 模式匹配

    模式匹配之字符串 模式匹配之匹配类型 模式匹配之匹配数组、元组、集合 模式匹配之样例类 模式匹配之偏函数

  • 多模式串匹配 - AC 自动机

    多模式串匹配概念 多模式串匹配,即多个模式串在一个主串中进行匹配。 虽然单模式串也能完成多模式串的匹配,但每个模式...

  • Scala模式匹配

    模式匹配match 模式匹配不仅可以匹配值(case 1)还可以匹配类型(case s:String) 匹配过程有...

  • 正则表达式懒惰型元字符匹配 ?

    懒惰匹配模式即表示以最少的匹配量返回匹配个数,默认是非懒惰匹配模式 表达式 匹配结果:

  • scala 模式匹配的几个模式

    Scala 的模式匹配是类似与正则匹配的的模式匹配,但是不仅仅如此,它还可以匹配对象的内在的构建形式. 模式匹配就...

  • 模式匹配

    模式匹配 sql模式匹配允许使用"_"匹配任何单个字符,"%"匹配任意数目字符(包括零字符)。使用sql模式时,不...

  • Scala中的模式匹配

    简单匹配 模式匹配常用于match语句: 变量使用 模式匹配case中可以使用变量来获取参数值 类型匹配 守卫匹配...

  • web开发常识

    .gitignore规则 匹配模式前 / 代表项目的根目录 匹配模式最后加 / 代表是目录 匹配模式前加!代表取反...

  • 模式匹配

    模式 模式类型 通配符模式 _ 匹配任何值 _? 匹配非nil值 标识符模式 值绑定模式 元组模式 枚举case模...

网友评论

      本文标题:12模式匹配

      本文链接:https://www.haomeiwen.com/subject/ntwirttx.html