(case t
('int #t)
('bool #t)
+ ('void #t)
(else #f)))
(define (pretty-type t)
(car xs)
(last (cdr xs))))
-
(define (normalize prog) ; (+ a b) -> ((+ a) b)
(case (ast-type prog)
('lambda
`(,(normalize (car prog)) ,(normalize (cadr prog))) ; (f a)
`(,(list (normalize (car prog)) (normalize (cadr prog)))
,(normalize (caddr prog))))) ; (f a b)
- ;; (list (list (normalize (car prog))
- ;; (normalize (cadr prog))) (normalize (caddr prog))))) ; (f a b)
('let
(append (list 'let
(map (lambda (x) `(,(car x) ,(normalize (cadr x))))
(let-bindings prog)))
(map normalize (let-body prog))))
- ('if `(if ,(normalize (cadr prog))
- ,(normalize (caddr prog))
- ,(normalize (cadddr prog))))
- (else prog)))
+ (else (ast-traverse normalize prog))))
(define (builtin-type x)
(case x
('! '(abs bool bool))
('= '(abs int (abs int bool)))
('bool->int '(abs bool int))
+ ('print '(abs string void))
(else #f)))
; we typecheck the lambda calculus only (only single arg lambdas)
(case (ast-type x)
('int-literal (list '() 'int))
('bool-literal (list '() 'bool))
+ ('string-literal (list '() 'string))
('builtin (list '() (builtin-type x)))
('if