Racket 中的“match”是否可以包含来自外部范围的变量的模式?

Can `match` in Racket have patterns with variables from an outer scope?

考虑以下示例:

#lang racket

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

如果我想匹配头和尾相同的对,我可能会这样写。这不起作用,因为第二个 a 被绑定为一个新变量(并且匹配任何东西)。是否有任何模式形式允许我从外部范围使用先前绑定的 a

我知道这可以通过以下方式实现

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

但我仍然想知道是否有办法从外部范围获取该变量(或者是否有不这样做的原因,比如一些潜在的名称冲突问题或其他问题)。

使用==:

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

由于在文档中的位置,== 很容易被忽略。