File tree 1 file changed +34
-18
lines changed 1 file changed +34
-18
lines changed Original file line number Diff line number Diff line change 1
1
#lang racket
2
2
3
3
4
- ; ; ----- code -----
5
- (struct Closure (fun env))
6
-
7
- (define env0 '())
4
+ ; ; ----- main code -----
8
5
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)))
19
9
20
10
(define infer
21
11
(lambda (exp env )
78
68
[else
79
69
'bool ])]))])))
80
70
81
- (define r2i
82
- (lambda (exp )
83
- (infer exp env0)))
84
71
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 -----
85
90
(define failure
86
91
(lambda (who . args )
87
92
(display who) (display " : " )
90
95
(error " type check failed" )))
91
96
92
97
98
+
93
99
; ; ----- examples -----
94
100
95
101
(r2i ' (+ 1 2 ))
122
128
(r2i
123
129
' (let ([x 2 ])
124
130
(let ([f (lambda (y ) (* x y))])
125
- (let ([x 4 ])
131
+ (let ([x " hi " ])
126
132
(f 3 )))))
127
133
; ; => 'int
128
134
129
135
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
+
130
146
(r2i
131
147
' (let ([f (lambda (x ) x)])
132
148
(f " hi" )))
You can’t perform that action at this time.
0 commit comments