2010-06-21 2 views
2

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

ответ

5

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

+0

Thanx - dunno, как я пропустил это, так как я действительно искал его. Нет, действительно :-) – corvuscorax

Смежные вопросы