Альтернативы при сопоставлении с образцом в ракетке - PullRequest
2 голосов
/ 21 июня 2010

Я хочу сопоставить один из следующих двух списков в Racket (ранее PLT Scheme):

'(somename : (_ptr o sometype))

или

'(somename : (_ptr io sometype))

Как видите, единственное отличие - это литералы 'o и' io во встроенном списке.

Я вижу два основных способа сделать это.

Или:

(match myexpr 
    [(list name ': (list '_ptr 'o _)) name]
    [(list name ': (list '_ptr 'io _)) name]
    [_ 0])

, который кажется дублированием усилий, но очень ясен. Или:

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

, который избегает почти дублированных шаблонов, но гораздо менее ясен.

У меня вопрос: есть ли способ указать альтернативы в сопоставлении с образцом ракетки, что-то вроде {'o | «Ю}? И, если нет, какой из двух способов, описанных выше, был бы самым идиоматическим способом Ракетки?

1 Ответ

5 голосов
/ 21 июня 2010

Используйте шаблон or (or 'o 'io). И, конечно, не забывайте, что все это задокументировано .

...