From 7bcc8cc8aa41849a6f6e0615a1309b7ac3b3956f Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Thu, 15 Aug 2019 01:12:31 +0100 Subject: [PATCH] WIP on typechecking case statements --- typecheck.scm | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/typecheck.scm b/typecheck.scm index d180e44..6aca2c1 100644 --- a/typecheck.scm +++ b/typecheck.scm @@ -244,7 +244,40 @@ annotated))) - ('app (check-app env x))))) + ('app (check-app env x)) + ['case + (let* ([expr-type-res (check env (case-expr x))] + [expr-type (cadr env)] + [case-match-type-res (map (lambda (x) (check env x)) + (map car (case-cases x)))] + [case-match-types (map cadr case-match-type-res)] + + [case-expr-type-res (map (lambda (x) (check env x)) + (map cadr (case-cases x)))] + [case-expr-types (map cadr case-expr-types-res)] + + [case-match-equality-cs (fold-left constraint-merge '() + (map (lambda (t) (~ t expr-type)) case-match-types))] + + [case-expr-equality-cs (fold-left constraint-merge '() + (map (lambda (t) (~ t (car case-expr-type-res))) + (cdr case-expr-type-res)))] + + [resolved-type (substitute case-expr-eqaulity-cs (car case-expr-type-res))] + + [annotated `((case (,(case-expr x) : ,expr-type) + ,(map (lambda (c e et) + `(,c (,e : ,et))) + (map car (case-cases x)) + (map cadr (case-cases x)) + case-expr-types)) : ,resolved-type)] + + [cs (fold-left constraint-merge '() + (append case-match-equality-cs + case-expr-equality-cs + (cadr expr-type-res)))]) + (list cs resolved-type annotated))]))) + ;; (display "result of ") ;; (display x) ;; (display ":\n\t") -- 2.30.2