|
270 | 270 | (define/public (cast-insert)
|
271 | 271 | (lambda (e)
|
272 | 272 | (match e
|
273 |
| - [(? integer?) `(inject ,e Integer)] |
274 |
| - [(? symbol?) e] |
275 |
| - [`(read) `(inject (read) Integer)] |
276 |
| - [`(function-ref ,e ,n) `(inject (function-ref ,e) (,@(map (lambda (x) 'Any) (range n)) -> Any))] |
277 |
| - [`(+ ,e1 ,e2) `(inject (+ (project ,((cast-insert) e1) Integer) (project ,((cast-insert) e2) Integer)) Integer)] |
278 |
| - [`(- ,e) `(inject (- (project ,((cast-insert) e) Integer)) Integer)] |
279 |
| - [`(let ([,x ,e1]) ,e2) `(let ([,x ,((cast-insert) e1)]) ,((cast-insert) e2))] |
| 273 | + [(? integer?) |
| 274 | + `(inject ,e Integer)] |
| 275 | + [(? symbol?) |
| 276 | + e] |
| 277 | + [`(read) |
| 278 | + `(inject (read) Integer)] |
| 279 | + [`(function-ref ,e ,n) |
| 280 | + `(inject (function-ref ,e) |
| 281 | + (,@(map (lambda (x) 'Any) (range n)) -> Any))] |
| 282 | + [`(+ ,e1 ,e2) |
| 283 | + `(inject (+ (project ,((cast-insert) e1) Integer) |
| 284 | + (project ,((cast-insert) e2) Integer)) |
| 285 | + Integer)] |
| 286 | + [`(- ,e) |
| 287 | + `(inject (- (project ,((cast-insert) e) Integer)) |
| 288 | + Integer)] |
| 289 | + [`(let ([,x ,e1]) ,e2) |
| 290 | + `(let ([,x ,((cast-insert) e1)]) |
| 291 | + ,((cast-insert) e2))] |
280 | 292 | [#t `(inject #t Boolean)]
|
281 | 293 | [#f `(inject #f Boolean)]
|
282 |
| - [`(and ,e1 ,e2) (let ([gen (gensym)]) |
283 |
| - `(let ([,gen ,((cast-insert) e1)]) |
284 |
| - (if (eq? ,gen (inject #f Boolean)) |
285 |
| - ,gen |
286 |
| - ,((cast-insert) e2))))] |
287 |
| - [`(not ,e) `(inject (not (project ,((cast-insert) e) Boolean)) Boolean)] |
288 |
| - [`(eq? ,e1 ,e2) `(inject (eq? ,((cast-insert) e1),((cast-insert) e2)) Boolean)] |
289 |
| - [`(if ,eq ,et ,ef) `(if (eq? ,((cast-insert) eq) (inject #f Boolean)) ,((cast-insert) ef) ,((cast-insert) et))] |
290 |
| - [`(vector ,es ...) `(inject (vector ,@(map (cast-insert) es)) (Vector ,@(map (lambda (x) 'Any) es)))] |
291 |
| - [`(vector-ref ,e1 ,n) `(vector-ref (project ,((cast-insert) e1) (Vectorof Any)) ,n)] |
292 |
| - [`(vector-set! ,e1 ,n ,e2) `(inject (vector-set! (project ,((cast-insert) e1) (Vectorof Any)) ,n ,((cast-insert) e2)) Void)] |
293 |
| - [`(void) `(inject (void) Void)] ; ??? |
294 |
| - [`(lambda (,xs ...) ,e) `(inject (lambda: (,@(map (lambda (x) `[,x : Any]) xs)) : Any ,((cast-insert) e)) (,@(map (lambda (x) 'Any) xs) -> Any))] |
295 |
| - [`(app ,e ,es ...) `(app (project ,((cast-insert) e) (,@(map (lambda (x) 'Any) es) -> Any)) ,@(map (cast-insert) es))] |
296 |
| - [`(define (,f ,xs ...) ,e) `(define (,f ,@(map (lambda (x) `[,x : Any]) xs)) : Any ,((cast-insert) e))] |
297 |
| - [`(program ,ds ... ,e) `(program ,@(map (cast-insert) ds) ,((cast-insert) e))]))) |
| 294 | + [`(and ,e1 ,e2) |
| 295 | + (let ([gen (gensym)]) |
| 296 | + `(let ([,gen ,((cast-insert) e1)]) |
| 297 | + (if (eq? ,gen (inject #f Boolean)) |
| 298 | + ,gen |
| 299 | + ,((cast-insert) e2))))] |
| 300 | + [`(not ,e) |
| 301 | + `(inject (not (project ,((cast-insert) e) Boolean)) Boolean)] |
| 302 | + [`(eq? ,e1 ,e2) |
| 303 | + `(inject (eq? ,((cast-insert) e1) |
| 304 | + ,((cast-insert) e2)) |
| 305 | + Boolean)] |
| 306 | + [`(if ,eq ,et ,ef) |
| 307 | + `(if (eq? ,((cast-insert) eq) (inject #f Boolean)) |
| 308 | + ,((cast-insert) ef) |
| 309 | + ,((cast-insert) et))] |
| 310 | + [`(vector ,es ...) |
| 311 | + `(inject (vector ,@(map (cast-insert) es)) |
| 312 | + (Vector ,@(map (lambda (x) 'Any) es)))] |
| 313 | + [`(vector-ref ,e1 ,e2) |
| 314 | + `(vector-ref (project ,((cast-insert) e1) (Vectorof Any)) |
| 315 | + (project ,((cast-insert) e2) Integer))] |
| 316 | + [`(vector-set! ,e1 ,e2 ,e3) |
| 317 | + `(inject (vector-set! (project ,((cast-insert) e1) (Vectorof Any)) |
| 318 | + (project ,((cast-insert) e2) Integer) |
| 319 | + ,((cast-insert) e3)) |
| 320 | + Void)] |
| 321 | + [`(void) `(inject (void) Void)] |
| 322 | + [`(lambda (,xs ...) ,e) |
| 323 | + `(inject (lambda: (,@(map (lambda (x) `[,x : Any]) xs)) : Any |
| 324 | + ,((cast-insert) e)) |
| 325 | + (,@(map (lambda (x) 'Any) xs) -> Any))] |
| 326 | + [`(app ,e ,es ...) |
| 327 | + `(app (project ,((cast-insert) e) |
| 328 | + (,@(map (lambda (x) 'Any) es) -> Any)) |
| 329 | + ,@(map (cast-insert) es))] |
| 330 | + [`(define (,f ,xs ...) ,e) |
| 331 | + `(define (,f ,@(map (lambda (x) `[,x : Any]) xs)) : Any |
| 332 | + ,((cast-insert) e))] |
| 333 | + [`(program ,ds ... ,e) |
| 334 | + `(program ,@(map (cast-insert) ds) ,((cast-insert) e))]))) |
298 | 335 |
|
299 | 336 |
|
300 | 337 |
|
|
0 commit comments