X-Git-Url: http://git.lukelau.me/?p=scheme.git;a=blobdiff_plain;f=typecheck.scm;h=f6d7c86465f4869043b3d2fcb9560e42603258d7;hp=b3466751fdf7f4161963d3904c13f970b8798a76;hb=3d94d4500167a8327473e15cf477727968ee36a2;hpb=0db4aa6c791e5ed27bfd9c4461e7a5337ee699e1 diff --git a/typecheck.scm b/typecheck.scm index b346675..f6d7c86 100644 --- a/typecheck.scm +++ b/typecheck.scm @@ -194,10 +194,14 @@ (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))) @@ -211,6 +215,7 @@ (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)]