|
47 | 47 | [(? symbol?)
|
48 | 48 | (lookup ast env)]
|
49 | 49 | [(? integer?) ast]
|
50 |
| - [`(let ([,x ,e]) ,body) |
51 |
| - (let ([v ((interp-scheme env) e)]) |
52 |
| - ((interp-scheme (cons (cons x v) env)) body))] |
| 50 | + [`(let ([,x ,(app (interp-scheme env) v)]) ,body) |
| 51 | + ((interp-scheme (cons (cons x v) env)) body)] |
53 | 52 | [`(program ,e) ((interp-scheme '()) e)]
|
54 |
| - [`(,op ,args ...) #:when (set-member? (primitives) op) |
55 |
| - (apply (interp-op op) (map (interp-scheme env) args))] |
| 53 | + [`(,op ,(app (interp-scheme env) args) ...) |
| 54 | + #:when (set-member? (primitives) op) |
| 55 | + (apply (interp-op op) args)] |
56 | 56 | [else
|
57 | 57 | (error (format "no match in interp-scheme S0 for ~a" ast))]
|
58 | 58 | )))
|
|
979 | 979 | (define/override (interp-scheme env)
|
980 | 980 | (lambda (ast)
|
981 | 981 | (verbose "R6/interp-scheme" ast)
|
| 982 | + (define recur (interp-scheme env)) |
982 | 983 | (match ast
|
983 |
| - [`(inject ,e ,t) |
984 |
| - `(tagged ,((interp-scheme env) e) ,t)] |
985 |
| - [`(project ,e ,t2) |
986 |
| - (define v ((interp-scheme env) e)) |
| 984 | + [`(inject ,(app recur v) ,t) |
| 985 | + `(tagged ,v ,t)] |
| 986 | + [`(project ,(app recur v) ,t2) |
987 | 987 | (match v
|
988 | 988 | [`(tagged ,v1 ,t1)
|
989 |
| - (cond [(tyeq? t1 t2) |
990 |
| - v1] |
991 |
| - [else |
992 |
| - (error "in project, type mismatch" t1 t2)])] |
993 |
| - [else |
994 |
| - (error "in project, expected injected value" v)])] |
| 989 | + (cond [(tyeq? t1 t2) v1] |
| 990 | + [else (error "in project, type mismatch" t1 t2)])] |
| 991 | + [else (error "in project, expected injected value" v)])] |
995 | 992 | [else
|
996 | 993 | ((super interp-scheme env) ast)]
|
997 | 994 | )))
|
998 | 995 |
|
| 996 | + (define/override (interp-F env) |
| 997 | + (lambda (ast) |
| 998 | + (verbose "R6/interp-F" ast) |
| 999 | + (define recur (interp-F env)) |
| 1000 | + (match ast |
| 1001 | + [`(inject ,(app recur v) ,t) |
| 1002 | + `(tagged ,v ,t)] |
| 1003 | + [`(project ,(app recur v) ,t2) |
| 1004 | + (match v |
| 1005 | + [`(tagged ,v1 ,t1) |
| 1006 | + (cond [(tyeq? t1 t2) v1] |
| 1007 | + [else (error "in project, type mismatch" t1 t2)])] |
| 1008 | + [else (error "in project, expected injected value" v)])] |
| 1009 | + [else ((super interp-F env) ast)] |
| 1010 | + ))) |
| 1011 | + |
999 | 1012 | (define/override (interp-C env)
|
1000 | 1013 | (lambda (ast)
|
1001 | 1014 | (verbose "R6/interp-C" ast)
|
|
0 commit comments