;; give a good workout to variant case, including don't-care binding, inlining, etc..

(define (printn x)
  (%%cexp ('a -> undefined) "dump_object (%0, 0); fprintf (stdout, \"\\n\")" x))

(define (+ a b)
  (%%cexp (int int -> int) "%0+%1" a b))

(define (glort0 a)
  (vcase a
     ((:blurb x) x)
     ((:blort a b c) (+ a (+ b c)))
     ((:urk) 666)))
    
(define (glort1 a)
  (vcase a
     ((:blurb x) x)
     ((:blort _ _ _ ) 42)
     ((:urk) 666)))

(define (glort2 a)
  (vcase a
     ((:blurb x) x)
     ((:blort _ _ _ ) 42)
     (else 4242)))

(let ((x (:blurb 9))
      (y (:blort 12 13 14))
      (z (:urk))
      )
  (printn (glort0 x))
  (printn (glort0 y))
  (printn (glort0 z))
  (printn (glort1 x))
  (printn (glort1 y))
  (printn (glort1 z))
  (printn (glort2 x))
  (printn (glort2 y))
  (printn (glort2 z))
  )