在Racket中进行模式匹配时的替代方案

cor*_*rax 2 pattern-matching racket

我想匹配Racket(以前的PLT Scheme)中的以下两个列表之一:

'(somename : (_ptr o sometype))
Run Code Online (Sandbox Code Playgroud)

要么

'(somename : (_ptr io sometype))
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,唯一的区别是嵌入式列表中的文字"o"和"io".

我可以看到两种基本方法来做到这一点.

或者:

(match myexpr 
    [(list name ': (list '_ptr 'o _)) name]
    [(list name ': (list '_ptr 'io _)) name]
    [_ 0])
Run Code Online (Sandbox Code Playgroud)

这似乎是重复的努力,但非常清楚.要么:

(match myexpr 
    [(list name ': (list '_ptr mode _)) 
      (if (or (eq? mode 'o) 
              (eq? mode 'io))
     name
     0)]
    [_ 0])
Run Code Online (Sandbox Code Playgroud)

这避免了几乎重复的模式,但不太清楚.

我的问题是,有没有办法在球拍模式匹配中指定替代品,类似{'o | "IO}?而且,如果没有,上面列出的两种方式中的哪一种将是最惯用的Racket方式?

Eli*_*lay 5

使用or模式(or 'o 'io).当然,不要忘记所有这些都记录在案.