美文网首页
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模式匹配

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