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