Skip to content

Commit 1f3db77

Browse files
committed
reorder
1 parent 955f023 commit 1f3db77

File tree

1 file changed

+34
-18
lines changed

1 file changed

+34
-18
lines changed

r2-typeinference.ss

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,11 @@
11
#lang racket
22

33

4-
;; ----- code -----
5-
(struct Closure (fun env))
6-
7-
(define env0 '())
4+
;; ----- main code -----
85

9-
(define ext-env
10-
(lambda (x v env)
11-
(cons `(,x . ,v) env)))
12-
13-
(define lookup
14-
(lambda (x env)
15-
(let ([p (assq x env)])
16-
(cond
17-
[(not p) #f]
18-
[else (cdr p)]))))
6+
(define r2i
7+
(lambda (exp)
8+
(infer exp env0)))
199

2010
(define infer
2111
(lambda (exp env)
@@ -78,10 +68,25 @@
7868
[else
7969
'bool])]))])))
8070

81-
(define r2i
82-
(lambda (exp)
83-
(infer exp env0)))
8471

72+
;; ----- environment -----
73+
(struct Closure (fun env))
74+
75+
(define env0 '())
76+
77+
(define ext-env
78+
(lambda (x v env)
79+
(cons `(,x . ,v) env)))
80+
81+
(define lookup
82+
(lambda (x env)
83+
(let ([p (assq x env)])
84+
(cond
85+
[(not p) #f]
86+
[else (cdr p)]))))
87+
88+
89+
;; ----- utility -----
8590
(define failure
8691
(lambda (who . args)
8792
(display who) (display ": ")
@@ -90,6 +95,7 @@
9095
(error "type check failed")))
9196

9297

98+
9399
;; ----- examples -----
94100

95101
(r2i '(+ 1 2))
@@ -122,11 +128,21 @@
122128
(r2i
123129
'(let ([x 2])
124130
(let ([f (lambda (y) (* x y))])
125-
(let ([x 4])
131+
(let ([x "hi"])
126132
(f 3)))))
127133
;; => 'int
128134

129135

136+
(r2i
137+
'(let ([x "hi"])
138+
(let ([f (lambda (y) (* x y))])
139+
(let ([x 4])
140+
(f 3)))))
141+
;; infer: first operand to operator * must be int
142+
;; but got: string
143+
;; type check failed
144+
145+
130146
(r2i
131147
'(let ([f (lambda (x) x)])
132148
(f "hi")))

0 commit comments

Comments
 (0)