Может ли `match` в Racket иметь шаблоны с переменными из внешней области?

Рассмотрим следующий пример:

#lang racket

(match '(cat . doge)
  [`(,a . ,b)
   (match b
     [a #t]
     [_ #f])]
  [_ "Not a pair"])

Это то, что я мог бы написать, если бы я хотел сопоставлять пары, где голова и хвост одинаковы. Это не работает, потому что вторая a связана как новая переменная (и соответствует чему-либо). Существуют ли какие-либо шаблонные формы, которые позволяют мне использовать ранее связанный a из внешней области?

Я знаю, что это может быть достигнуто следующим образом

(match* ('cat 'doge)
  [(a a) #t]
  [(_ _) #f])

но мне все же хотелось бы знать, есть ли способ получить эту переменную из внешней области (или если есть причина не делать этого, например, потенциальная проблема столкновения имен или что-то в этом роде).

Ответы

Ответ 1

Используйте ==:

(match '(cat . doge)
  [`(,a . ,b)
   (match b
     [(== a) #t]
     [_      #f])]
  [_ "Not a pair"])

Из-за размещения в документах == легко пропустить.