Я хочу сопоставить один из следующих двух списков в 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 | «Ю}? И, если нет, какой из двух способов, описанных выше, был бы самым идиоматическим способом Ракетки?