Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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).

like image 598
Chris Brooks Avatar asked Apr 30 '15 21:04

Chris Brooks


1 Answers

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.

like image 87
soegaard Avatar answered Sep 27 '22 02:09

soegaard