|
42 | 42 | (nonterminal ml-type |
43 | 43 | #:binding-space ml |
44 | 44 | Nat |
| 45 | + L |
45 | 46 | (-> t1:ml-type t2:ml-type)) |
46 | 47 |
|
47 | 48 | (host-interface/expression |
|
54 | 55 | #`(ml->racket #,e^))) |
55 | 56 |
|
56 | 57 | (struct ml-value [v t]) |
57 | | - |
58 | | -(define (seal e t) |
59 | | - (ml-value e t)) |
60 | | - |
61 | | -(define (unseal e t) |
62 | | - (unless (ml-value? e) |
63 | | - (error 'MR "not an ML value")) |
64 | | - (let ([v (ml-value-v e)] |
65 | | - [t (ml-value-t e)]) |
66 | | - (if (equal? t t) |
67 | | - v |
68 | | - (error 'unseal "type mismatch")))) |
| 58 | +(struct racket-value [v]) |
| 59 | + |
| 60 | +(define (RM-translation v t) |
| 61 | + (if (equal? (syntax->datum t) 'L) |
| 62 | + (if (racket-value? v) |
| 63 | + (racket-value-v v) |
| 64 | + (error 'RM "not a Racket value")) |
| 65 | + (ml-value v t))) |
| 66 | + |
| 67 | +(define (MR-translation v t) |
| 68 | + (if (equal? (syntax->datum t) 'L) |
| 69 | + (racket-value v) |
| 70 | + (if (ml-value? v) |
| 71 | + (let ([v (ml-value-v v)] |
| 72 | + [t (ml-value-t v)]) |
| 73 | + (if (equal? t t) |
| 74 | + v |
| 75 | + (error 'MR "type mismatch"))) |
| 76 | + (error 'MR "not an ML value")))) |
69 | 77 |
|
70 | 78 | (begin-for-syntax |
71 | 79 | (define (compile-RM e) |
72 | 80 | (define-values (e^ t) (infer-type e)) |
73 | | - #`(seal (ml->racket #,e^) #'#,t)) |
| 81 | + #`(RM-translation (ml->racket #,e^) #'#,t)) |
74 | 82 |
|
75 | 83 | ;; No type variables yet, so should just be datum equality. |
76 | 84 | (define (assert-type-equal! actual expected term) |
|
163 | 171 | [(_ (lambda ([x t]) b)) |
164 | 172 | #'(lambda (x) (ml->racket b))] |
165 | 173 | [(_ (MR e t)) |
166 | | - #'(unseal e #'t)])) |
| 174 | + #'(MR-translation e #'t)])) |
167 | 175 |
|
168 | 176 |
|
169 | 177 | (module+ test |
|
188 | 196 | (check-equal? (ml ((lambda ([x Nat]) (+ (MR (let ([v x]) v)) 1)) 5)) |
189 | 197 | 6) |
190 | 198 |
|
191 | | - (ml (lambda ([x Nat]) (+ (MR (RM x)) 1))) |
| 199 | + (check-equal? |
| 200 | + (racket-value-v (ml (: ((lambda ([x L]) (: (MR (+ x 1)) L)) (: (MR 5) L)) L))) |
| 201 | + 6) |
| 202 | + |
192 | 203 |
|
193 | 204 | (check-type-error |
194 | 205 | (ml (app (lambda ([x Nat]) x) (lambda ([y Nat]) y))) |
|
0 commit comments