Skip to content

Commit 14deba3

Browse files
committed
made some progress
1 parent fd76e8a commit 14deba3

File tree

7 files changed

+69
-55
lines changed

7 files changed

+69
-55
lines changed

dynamic-interp.rkt

Lines changed: 39 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
(require "utilities.rkt" (prefix-in runtime-config: "runtime-config.rkt"))
44
(provide interp-r7)
55

6-
(define get-injected-type
6+
(define get-tagged-type
77
(lambda (e)
88
(match e
9-
[`(inject ,v ,ty) ty])))
9+
[`(tagged ,v ,ty) ty])))
1010

1111
(define valid-op?
1212
(lambda (op)
@@ -15,36 +15,37 @@
1515
(define interp-r7-op
1616
(lambda (op es)
1717
(match `(,op ,es)
18-
[`(+ ((inject ,v1 Integer) (inject ,v2 Integer)))
19-
`(inject ,(fx+ v1 v2) Integer)]
20-
[`(- ((inject ,v Integer)))
21-
`(inject ,(fx- 0 v) Integer)]
18+
[`(+ ((tagged ,v1 Integer) (tagged ,v2 Integer)))
19+
`(tagged ,(fx+ v1 v2) Integer)]
20+
[`(- ((tagged ,v Integer)))
21+
`(tagged ,(fx- 0 v) Integer)]
2222
[`(and (,v1 ,v2))
2323
(match v1
24-
[`(inject #f Boolean) v1]
24+
[`(tagged #f Boolean) v1]
2525
[else v2])]
2626
[`(or (,v1 ,v2))
2727
(match v1
28-
[`(inject #f Boolean) v2]
28+
[`(tagged #f Boolean) v2]
2929
[else v1])]
3030
[`(not (,v1))
3131
(match v1
32-
[`(inject #f Boolean) `(inject #t Boolean)]
33-
[else `(inject #f Boolean)])])))
32+
[`(tagged #f Boolean) `(tagged #t Boolean)]
33+
[else `(tagged #f Boolean)])])))
3434

3535
(define (interp-r7 env)
3636
(lambda (ast)
3737
(vomit "interp-r7" ast env)
38+
(define recur (interp-r7 env))
3839
(match ast
3940
[(? symbol?) (lookup ast env)]
4041
[`(function-ref ,f) (lookup f env)]
4142
[`(function-ref ,f ,n) (lookup f env)] ;; This is to deal with the detail of our translation that it keeps the arity of functions in the funref
42-
[(? integer?) `(inject ,ast Integer)]
43-
[#t `(inject #t Boolean)]
44-
[#f `(inject #f Boolean)]
45-
[`(read) `(inject ,(read-fixnum) Integer)]
43+
[(? integer?) `(tagged ,ast Integer)]
44+
[#t `(tagged #t Boolean)]
45+
[#f `(tagged #f Boolean)]
46+
[`(read) `(tagged ,(read-fixnum) Integer)]
4647
[`(lambda (,xs ...) ,body)
47-
`(inject (lambda ,xs ,body ,env) (,@(map (lambda (x) 'Any) xs) -> Any))]
48+
`(tagged (lambda ,xs ,body ,env) (,@(map (lambda (x) 'Any) xs) -> Any))]
4849
[`(define (,f ,xs ...) ,body)
4950
(mcons f `(lambda ,xs ,body))]
5051
[`(program ,ds ... ,body)
@@ -53,50 +54,50 @@
5354
(for/list ([b top-level])
5455
(set-mcdr! b (match (mcdr b)
5556
[`(lambda ,xs ,body)
56-
`(inject (lambda ,xs ,body ,top-level)
57+
`(tagged (lambda ,xs ,body ,top-level)
5758
(,@(map (lambda (x) 'Any) xs) -> Any))])))
5859
((interp-r7 top-level) body))]
5960
[`(vector ,es ...)
60-
(let* ([elts (map (interp-r7 env) es)]
61-
[tys (map get-injected-type elts)])
62-
`(inject ,(apply vector (map (interp-r7 env) es)) (Vector ,@tys)))]
61+
(let* ([elts (map recur es)]
62+
[tys (map get-tagged-type elts)])
63+
`(tagged ,(apply vector (map recur es)) (Vector ,@tys)))]
6364
[`(vector-set! ,e1 ,n ,e2)
64-
(let ([e1^ ((interp-r7 env) e1)]
65-
[e2^ ((interp-r7 env) e2)])
65+
(let ([e1^ (recur e1)]
66+
[e2^ (recur e2)])
6667
(match e1^
67-
[`(inject ,vec ,ty)
68+
[`(tagged ,vec ,ty)
6869
(vector-set! vec n e2^)
69-
`(inject (void) Void)]))]
70+
`(tagged (void) Void)]))]
7071
[`(vector-ref ,e ,n)
71-
(let ([e^ ((interp-r7 env) e)])
72+
(let ([e^ (recur e)])
7273
(match e^
73-
[`(inject ,vec ,ty)
74+
[`(tagged ,vec ,ty)
7475
(vector-ref vec n)]))]
7576
[`(let ([,x ,e]) ,body)
76-
(let ([v ((interp-r7 env) e)])
77+
(let ([v (recur e)])
7778
((interp-r7 (cons (cons x v) env)) body))]
7879
[`(,op ,es ...) #:when (valid-op? op)
79-
(interp-r7-op op (map (interp-r7 env) es))]
80+
(interp-r7-op op (map recur es))]
8081
[`(eq? ,l ,r)
81-
`(inject ,(equal? ((interp-r7 env) l) ((interp-r7 env) r)) Boolean)]
82+
`(tagged ,(equal? (recur l) (recur r)) Boolean)]
8283
[`(if ,q ,t ,f)
83-
(match ((interp-r7 env) q)
84-
[`(inject #f Boolean)
85-
((interp-r7 env) f)]
86-
[else ((interp-r7 env) t)])]
84+
(match (recur q)
85+
[`(tagged #f Boolean)
86+
(recur f)]
87+
[else (recur t)])]
8788
[`(app ,f ,es ...)
88-
(define new-args (map (interp-r7 env) es))
89-
(let ([f-val ((interp-r7 env) f)])
89+
(define new-args (map recur es))
90+
(let ([f-val (recur f)])
9091
(match f-val
91-
[`(inject (lambda (,xs ...) ,body ,lam-env) ,ty)
92+
[`(tagged (lambda (,xs ...) ,body ,lam-env) ,ty)
9293
(define new-env (append (map cons xs new-args) lam-env))
9394
((interp-r7 new-env) body)]
9495
[else (error "interp-r7, expected function, not" f-val)]))]
9596
[`(,f ,es ...)
96-
(define new-args (map (interp-r7 env) es))
97-
(let ([f-val ((interp-r7 env) f)])
97+
(define new-args (map recur es))
98+
(let ([f-val (recur f)])
9899
(match f-val
99-
[`(inject (lambda (,xs ...) ,body ,lam-env) ,ty)
100+
[`(tagged (lambda (,xs ...) ,body ,lam-env) ,ty)
100101
(define new-env (append (map cons xs new-args) lam-env))
101102
((interp-r7 new-env) body)]
102103
[else (error "interp-r7, expected function, not" f-val)]))])))

dynamic-typing.rkt

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@
2424

2525
(define/override (type-check env)
2626
(lambda (e)
27+
(define recur (type-check env))
2728
(match e
28-
[`(vector-ref ,(app (type-check env) e t) ,i)
29+
[`(vector-ref ,(app recur e t) ,i)
2930
(match t
3031
[`(Vector ,ts ...)
3132
(unless (and (exact-nonnegative-integer? i)
@@ -39,9 +40,8 @@
3940
(error 'type-check "invalid index ~a" i))
4041
(values `(has-type (vector-ref ,e (has-type ,i Integer)) ,t) t)]
4142
[else (error "expected a vector in vector-ref, not" t)])]
42-
[`(vector-set! ,e-vec ,i ,e-arg)
43-
(define-values (e-vec^ t-vec) ((type-check env) e-vec))
44-
(define-values (e-arg^ t-arg) ((type-check env) e-arg))
43+
[`(vector-set! ,(app recur e-vec^ t-vec) ,i
44+
,(app recur e-arg^ t-arg) )
4545
(match t-vec
4646
[`(Vector ,ts ...)
4747
(unless (and (exact-nonnegative-integer? i)
@@ -65,22 +65,20 @@
6565
[else (error 'type-check
6666
"expected a vector in vector-set!, not ~a"
6767
t-vec)])]
68-
[`(inject ,e ,ty)
69-
(define-values (new-e e-ty) ((type-check env) e))
68+
[`(inject ,(app recur new-e e-ty) ,ty)
7069
(cond
7170
[(equal? e-ty ty)
7271
(values `(has-type (inject ,new-e ,ty) Any) 'Any)]
7372
[else
7473
(error "injected expression does not have expected type" e ty)])]
75-
[`(project ,e ,ty)
76-
(define-values (new-e e-ty) ((type-check env) e))
74+
[`(project ,(app recur new-e e-ty) ,ty)
7775
(cond
7876
[(equal? e-ty 'Any)
7977
(values `(has-type (project ,new-e ,ty) ,ty) ty)]
8078
[else
8179
(error "project expression does not have type Any" e)])]
8280
[`(,pred ,e) #:when (set-member? type-predicates pred)
83-
(define-values (new-e e-ty) ((type-check env) e))
81+
(define-values (new-e e-ty) (recur e))
8482
(cond
8583
[(equal? e-ty 'Any)
8684
(values `(has-type (,pred ,new-e) Boolean) 'Boolean)]
@@ -451,11 +449,11 @@
451449
("reveal-functions" ,(send compiler reveal-functions '())
452450
,(interp-r7 '()))
453451
("cast-insert" ,(send compiler cast-insert)
454-
,(send interp interp-scheme '()))
452+
,(send interp interp-F '()))
455453
("type-check" ,(send compiler type-check '())
456-
,(send interp interp-scheme '()))
454+
,(send interp interp-F '()))
457455
("convert-to-closures" ,(send compiler convert-to-closures)
458-
,(send interp interp-scheme '()))
456+
,(send interp interp-F '()))
459457
("flatten" ,(send compiler flatten #f)
460458
,(send interp interp-C '()))
461459
("expose allocation"

interp.rkt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,14 @@
520520
['vector-set! vector-set!]
521521
[else (super interp-op op)]))
522522

523+
(define/override (interp-scheme env)
524+
(lambda (ast)
525+
(verbose "R2/interp-scheme" ast)
526+
(match ast
527+
[`(void) (void)]
528+
[else ((super interp-scheme env) ast)]
529+
)))
530+
523531
(define (mem-error message expr)
524532
(lambda (who fmt . args)
525533
(error who "~a in ~a raise error:\n~a"
@@ -546,6 +554,7 @@
546554
(lambda (ast)
547555
(vomit "R2/interp-C" ast)
548556
(match ast
557+
[`(void) (void)]
549558
;; I should do better than make these noops - andre
550559
[`(initialize ,s ,h)
551560
(unless (and (exact-nonnegative-integer? s)
@@ -690,7 +699,7 @@
690699

691700
(define/public (non-apply-ast)
692701
(set-union (primitives)
693-
(set 'if 'let 'define 'program 'has-type)))
702+
(set 'if 'let 'define 'program 'has-type 'void)))
694703

695704
(define/override (interp-scheme env)
696705
(lambda (ast)
@@ -719,7 +728,7 @@
719728
(verbose "R3/interp-F" ast)
720729
(define result
721730
(match ast
722-
;; For R3
731+
;; For R4
723732
[`(define (,f [,xs : ,ps] ...) : ,rt ,body)
724733
(cons f `(lambda ,xs ,body))]
725734
[`(function-ref ,f)
@@ -737,7 +746,9 @@
737746
[`(program ,ds ... ,body)
738747
(let ([top-level (map (interp-F '()) ds)])
739748
((interp-F top-level) body))]
740-
;; For R2
749+
;; For R3
750+
[`(void) (void)]
751+
;; For R2
741752
[`(has-type ,e ,t) ((interp-F env) e)]
742753
[#t #t]
743754
[#f #f]

run-tests.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
(define suite-list
4040
`((0 . ,(range 1 28))
4141
(1 . ,(range 1 33))
42-
(2 . ,(range 1 19))
42+
(2 . ,(range 1 20))
4343
(3 . ,(range 1 20))
4444
(4 . ,(range 0 8))
4545
(6 . ,(range 0 10))

tests/s2_19.res

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#<void>

tests/s2_19.rkt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
(void)

vectors.rkt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,9 @@
243243
(lambda (x)
244244
(vomit "select instructions" x)
245245
(match x
246-
[`(void) `(int 0)]
246+
;[`(void) `(int 0)] I don't think this line is needed. -Jeremy
247+
[`(assign ,(app (select-instructions) lhs^) (void))
248+
`((movq (int 0) ,lhs^))]
247249
[`(assign ,lhs (has-type (allocate ,length) (Vector ,ts ...)))
248250
(define lhs^ ((select-instructions) lhs))
249251
;; Add one quad word for the meta info tag

0 commit comments

Comments
 (0)