+ (define (pattern-match x body)
+ (if (eqv? (ast-type x) 'var)
+ (cons x body)
+ (let* ([constructor (car x)]
+ [destructor (lambda (i) `(destruct ,i ,constructor))])
+ (flat-map (lambda (y i)
+ (pattern-match y (list (destructor i) body)))
+ (cdr x)
+ (range 0 (length (cdr x)))))))
+ (flat-map (lambda (x) (pattern-match (car x) (cdr x))) (cadr e)))