Can `match` in Racket have patterns with variables

2019-04-03 16:09发布

问题:

Consider the following example:

#lang racket

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

This is what I might write if I wanted to match pairs where the head and tail are the same. This doesn't work though because the second a is bound as a new variable (and matches anything). Are there any pattern forms which allow me to use the previously bound a from the outer scope?

I know this can be achieved in the following way

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

but I still would like to know if there is a way to get that variable from the outer scope (or if there is a reason for not doing so, like some potential name collision problem or something).

回答1:

Use ==:

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

Due to the placement in the docs, == is easy to overlook.