[racket] Any way to get "true" quasiquote behavior in match form?

From: Brian Mastenbrook (brian at mastenbrook.net)
Date: Fri Mar 9 20:31:29 EST 2012

On 03/09/2012 06:37 PM, rob cook wrote:
> That is, without using a macro or eval. Id like to do:
>
> (define a 4)
> (define l1 '(1 2 3))
> (match l1
>    (`(1 2 ,a) #t)
>    (_ #f))
>
> So that this example would result in #f, and #t if a bound to 3.
>
> Since of course match has its own quasiquote behavior, this does not
> seem possible w/o making a macro for "dynamic" match, or building the
> s-exp and using eval (yuck!).
>
> Is this correct, or have I missed something obvious?

It looks like what you're trying to do is to match a particular value 
which just so happens to be built using a quasiquote expression. The 
right way to do it is with the == match expander:

(define a 4)
(define l1 '(1 2 3))
(match l1
   ((== `(1 2 ,a)) #t)
   (_ #f)) ; -> #f

You can also put any other expression there:

(match l1
   ((== (append (take l1 2) (list (sub1 a)))) #t)
   (_ #f)) ;-> #t

Or use a different comparison predicate:

(match l1
   ((== `(1 2 ,(sub1 a)) eq?) #t)
   (_ #f)) ; -> #f

Hope that helps!

-- 
Brian Mastenbrook
brian at mastenbrook.net
http://brian.mastenbrook.net/


Posted on the users mailing list.