(if (eqv? 'var (ast-type x))
(list (cons x inner-offset))
(begin
- (emit "cmp $~a, ~a(%rbp)" x inner-offset)
+ (emit "cmpq $~a, ~a(%rbp)" x inner-offset)
(emit "jne ~a" jne-label)
'() )))))
(define (get-bindings product-types pattern)
(define (go product-type product)
- (case (ast-type x)
+ (case (ast-type product)
['var (list (cons product product-type))]
; an inner pattern match
- ['app (get-bindings product-type product)]))
+ ['app (let* ([inner-sum (car product)]
+ [inner-sums (cdr (assoc product-type dls))]
+ [inner-product-types (cdr (assoc inner-sum inner-sums))])
+ (get-bindings inner-product-types product))]
+ [else '()]))
(flat-map go product-types (cdr pattern)))
(let* ([names (cdr pattern)]
[product-types (cdr sum)]
[new-env (append (get-bindings product-types pattern) env)])
+
(check dls new-env expr)))]
; pattern match with binding and no constructor
['var (check dls (env-insert env pattern switch-type) expr)]