-
Notifications
You must be signed in to change notification settings - Fork 0
/
type-check-Lif.rkt
50 lines (43 loc) · 1.86 KB
/
type-check-Lif.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#lang racket
(require "utilities.rkt")
(require "type-check-Lvar.rkt")
(provide type-check-Lif type-check-Lif-class)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Booleans and Control Flow ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; type-check-Lif
(define type-check-Lif-class
(class type-check-Lvar-class
(super-new)
(inherit check-type-equal?)
(define/override (operator-types)
(append '((and . ((Boolean Boolean) . Boolean))
(or . ((Boolean Boolean) . Boolean))
(< . ((Integer Integer) . Boolean))
(<= . ((Integer Integer) . Boolean))
(> . ((Integer Integer) . Boolean))
(>= . ((Integer Integer) . Boolean))
(not . ((Boolean) . Boolean))
)
(super operator-types)))
(define/override (type-check-exp env)
(lambda (e)
(match e
[(Bool b) (values (Bool b) 'Boolean)]
[(If cnd thn els)
(define-values (cnd^ Tc) ((type-check-exp env) cnd))
(define-values (thn^ Tt) ((type-check-exp env) thn))
(define-values (els^ Te) ((type-check-exp env) els))
(check-type-equal? Tc 'Boolean e)
(check-type-equal? Tt Te e)
(values (If cnd^ thn^ els^) Te)]
[(Prim 'eq? (list e1 e2))
(define-values (e1^ T1) ((type-check-exp env) e1))
(define-values (e2^ T2) ((type-check-exp env) e2))
(check-type-equal? T1 T2 e)
(values (Prim 'eq? (list e1^ e2^)) 'Boolean)]
[else ((super type-check-exp env) e)])))
))
(define (type-check-Lif p)
(send (new type-check-Lif-class) type-check-program p))