(load "ast.scm")
+(load "stdlib.scm")
(define (abs? t)
(and (list? t) (eq? (car t) 'abs)))
(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)]
((res
(case (ast-type x)
('int-literal (make-result '() 'Int))
- ('bool-literal (make-result '() 'Bool))
('string-literal (make-result '() 'String))
('builtin (make-result '() (builtin-type x)))
(flat-map data-tors-type-env (program-data-layouts prog)))
; we typecheck the lambda calculus only (only single arg lambdas)
-(define (typecheck prog)
- (let ([expanded (expand-pattern-matches prog)])
+(define (typecheck prog-without-stdlib)
+ (let* ([prog (append stdlib prog-without-stdlib)]
+ [expanded (expand-pattern-matches prog)])
(cadr (check (program-data-layouts prog)
(init-adts-env expanded)
(normalize (program-body expanded))))))