Skip to content

Commit 6f871d7

Browse files
committed
r7 interpreter progress!
1 parent a93c750 commit 6f871d7

File tree

5 files changed

+144
-31
lines changed

5 files changed

+144
-31
lines changed

dynamic-interp.rkt

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#lang racket
2+
(require racket/fixnum)
3+
(require "utilities.rkt" (prefix-in runtime-config: "runtime-config.rkt"))
4+
(provide interp-r7)
5+
6+
(define get-injected-type
7+
(lambda (e)
8+
(match e
9+
[`(inject ,v ,ty) ty])))
10+
11+
(define valid-op?
12+
(lambda (op)
13+
(member op '(+ - and or not))))
14+
15+
(define interp-r7-op
16+
(lambda (op es)
17+
(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)]
22+
[`(and (,v1 ,v2))
23+
(match v1
24+
[`(inject #f Boolean) v1]
25+
[else v2])]
26+
[`(or (,v1 ,v2))
27+
(match v1
28+
[`(inject #f Boolean) v2]
29+
[else v1])]
30+
[`(not (,v1))
31+
(match v1
32+
[`(inject #f Boolean) `(inject #t Boolean)]
33+
[else `(inject #f Boolean)])])))
34+
35+
(define (interp-r7 env)
36+
(lambda (ast)
37+
(vomit "interp-r7" ast env)
38+
(match ast
39+
[(? symbol?) (lookup ast env)]
40+
[`(function-ref ,f) (lookup f env)]
41+
[`(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)]
46+
[`(lambda (,xs ...) ,body)
47+
`(inject (lambda ,xs ,body ,env) (,@(map (lambda (x) 'Any) xs) -> Any))]
48+
[`(define (,f ,xs ...) ,body)
49+
(mcons f `(lambda ,xs ,body))]
50+
[`(program ,ds ... ,body)
51+
(let ([top-level (map (interp-r7 '()) ds)])
52+
;; Use set-cdr! on define lambda's for mutual recursion
53+
(for/list ([b top-level])
54+
(set-mcdr! b (match (mcdr b)
55+
[`(lambda ,xs ,body)
56+
`(inject (lambda ,xs ,body ,top-level)
57+
(,@(map (lambda (x) 'Any) xs) -> Any))])))
58+
((interp-r7 top-level) body))]
59+
[`(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)))]
63+
[`(vector-set! ,e1 ,n ,e2)
64+
(let ([e1^ ((interp-r7 env) e1)]
65+
[e2^ ((interp-r7 env) e2)])
66+
(match e1^
67+
[`(inject ,vec ,ty)
68+
(vector-set! vec n e2^)
69+
`(inject (void) Void)]))]
70+
[`(vector-ref ,e ,n)
71+
(let ([e^ ((interp-r7 env) e)])
72+
(match e^
73+
[`(inject ,vec ,ty)
74+
(vector-ref vec n)]))]
75+
[`(let ([,x ,e]) ,body)
76+
(let ([v ((interp-r7 env) e)])
77+
((interp-r7 (cons (cons x v) env)) body))]
78+
[`(,op ,es ...) #:when (valid-op? op)
79+
(interp-r7-op op (map (interp-r7 env) es))]
80+
[`(eq? ,l ,r)
81+
`(inject ,(equal? ((interp-r7 env) l) ((interp-r7 env) r)) Boolean)]
82+
[`(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)])]
87+
[`(app ,f ,es ...)
88+
(define new-args (map (interp-r7 env) es))
89+
(let ([f-val ((interp-r7 env) f)])
90+
(match f-val
91+
[`(inject (lambda (,xs ...) ,body ,lam-env) ,ty)
92+
(define new-env (append (map cons xs new-args) lam-env))
93+
((interp-r7 new-env) body)]
94+
[else (error "interp-r7, expected function, not" f-val)]))]
95+
[`(,f ,es ...)
96+
(define new-args (map (interp-r7 env) es))
97+
(let ([f-val ((interp-r7 env) f)])
98+
(match f-val
99+
[`(inject (lambda (,xs ...) ,body ,lam-env) ,ty)
100+
(define new-env (append (map cons xs new-args) lam-env))
101+
((interp-r7 new-env) body)]
102+
[else (error "interp-r7, expected function, not" f-val)]))])))

dynamic-typing.rkt

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
(require racket/set)
33
(require "utilities.rkt")
44
(require "interp.rkt")
5+
(require "dynamic-interp.rkt")
56
(require "lambda.rkt")
67

78
(provide compile-R6 R6-passes R6-typechecker R7-passes)
@@ -440,41 +441,42 @@
440441
)))
441442

442443
(define R7-passes
443-
(let ([compiler (new compile-R7)])
444+
(let ([compiler (new compile-R7)]
445+
[interp (new interp-R6)])
444446
`(
445447
("uniquify" ,(send compiler uniquify '())
446-
#f)
448+
,(interp-r7 '()))
447449
("reveal-functions" ,(send compiler reveal-functions '())
448-
#f)
450+
,(interp-r7 '()))
449451
("translate" ,(send compiler cast-insert)
450-
#f)
452+
,(send interp interp-scheme '()))
451453
("inserthastype" ,(send compiler type-check '())
452-
#f)
454+
,(send interp interp-scheme '()))
453455
("convert-to-closures" ,(send compiler convert-to-closures)
454-
#f)
456+
,(send interp interp-scheme '()))
455457
("flatten" ,(send compiler flatten #f)
456-
#f)
458+
,(send interp interp-C '()))
457459
("expose allocation"
458460
,(send compiler expose-allocation)
459-
#f)
461+
,(send interp interp-C '()))
460462
("uncover call live roots"
461463
,(send compiler uncover-call-live-roots)
462-
#f)
464+
,(send interp interp-C '()))
463465
("instruction selection" ,(send compiler select-instructions)
464-
#f)
466+
,(send interp interp-x86 '()))
465467
("liveness analysis" ,(send compiler uncover-live (void))
466-
#f)
468+
,(send interp interp-x86 '()))
467469
("build interference" ,(send compiler build-interference
468470
(void) (void))
469-
#f)
471+
,(send interp interp-x86 '()))
470472
("build move graph" ,(send compiler
471473
build-move-graph (void))
472-
#f)
474+
,(send interp interp-x86 '()))
473475
("allocate registers" ,(send compiler allocate-registers)
474-
#f)
476+
,(send interp interp-x86 '()))
475477
("lower conditionals" ,(send compiler lower-conditionals)
476-
#f)
478+
,(send interp interp-x86 '()))
477479
("patch instructions" ,(send compiler patch-instructions)
478-
#f)
480+
,(send interp interp-x86 '()))
479481
("print x86" ,(send compiler print-x86) #f)
480482
)))

interp.rkt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,15 @@
888888
[else (super interp-op op)]
889889
))
890890

891+
(define/public (tyeq? t1 t2)
892+
;; (display t1) (display " ") (display t2) (newline) (flush-output)
893+
(match `(,t1 ,t2)
894+
[`((Vectorof ,t1) (Vector ,t2s ...))
895+
(foldr (lambda (x y) (and x y)) #t (map (lambda (x) (tyeq? t1 x)) t2s))] ;; wtf racket, why cant i just pass and?
896+
[`((Vector ,t1s ...) (Vectorof ,t2))
897+
(foldr (lambda (x y) (and x y)) #t (map (lambda (x) (tyeq? t2 x)) t1s))]
898+
[else (equal? t1 t2)]))
899+
891900
(define/override (interp-scheme env)
892901
(lambda (ast)
893902
(verbose "R6/interp-scheme" ast)
@@ -898,7 +907,7 @@
898907
(define v ((interp-scheme env) e))
899908
(match v
900909
[`(inject ,v1 ,t1)
901-
(cond [(equal? t1 t2)
910+
(cond [(tyeq? t1 t2)
902911
v1]
903912
[else
904913
(error "in project, type mismatch" t1 t2)])]
@@ -918,7 +927,7 @@
918927
(define v ((interp-C env) e))
919928
(match v
920929
[`(inject ,v1 ,t1)
921-
(cond [(equal? t1 t2)
930+
(cond [(tyeq? t1 t2)
922931
v1]
923932
[else
924933
(error "in project, type mismatch" t1 t2)])]

run-tests.rkt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
(require "lambda.rkt")
99
(require "dynamic-typing.rkt")
1010
(require "interp.rkt")
11+
(require "dynamic-interp.rkt")
1112
(require "runtime-config.rkt")
1213

1314
;; I have made the original run-tests more programmatic so that we
@@ -20,15 +21,15 @@
2021
;; Table associating names of compilers with the information for
2122
;; running and testing them.
2223
(define compiler-list
23-
;; Name Typechecker Compiler-Passes Use interpreter? Valid suites
24-
`(("int_exp" #f ,int-exp-passes #t (0))
25-
("reg_int_exp" #f ,reg-int-exp-passes #t (0))
26-
("conditionals" ,conditionals-typechecker ,conditionals-passes #t (0 1))
27-
("vectors" ,vectors-typechecker ,vectors-passes #t (0 1 2))
28-
("functions" ,functions-typechecker ,functions-passes #t (0 1 2 3))
29-
("lambda" ,lambda-typechecker ,lambda-passes #t (0 1 2 3 4))
30-
("any" ,R6-typechecker ,R6-passes #t (0 1 2 3 4 6))
31-
("dynamic" #f ,R7-passes #f (7))
24+
;; Name Typechecker Compiler-Passes Initial interpreter Valid suites
25+
`(("int_exp" #f ,int-exp-passes ,interp-scheme (0))
26+
("reg_int_exp" #f ,reg-int-exp-passes ,interp-scheme (0))
27+
("conditionals" ,conditionals-typechecker ,conditionals-passes ,interp-scheme (0 1))
28+
("vectors" ,vectors-typechecker ,vectors-passes ,interp-scheme (0 1 2))
29+
("functions" ,functions-typechecker ,functions-passes ,interp-scheme (0 1 2 3))
30+
("lambda" ,lambda-typechecker ,lambda-passes ,interp-scheme (0 1 2 3 4))
31+
("any" ,R6-typechecker ,R6-passes ,interp-scheme (0 1 2 3 4 6))
32+
("dynamic" #f ,R7-passes ,(interp-r7 '()) (7))
3233
))
3334

3435
(define compiler-table (make-immutable-hash compiler-list))
@@ -56,8 +57,7 @@
5657
(define (test-compiler name typechecker use-interp passes test-suite test-nums)
5758
(display "------------------------------------------------------")(newline)
5859
(display "testing compiler ")(display name)(newline)
59-
(unless (not use-interp)
60-
(interp-tests name typechecker passes interp-scheme test-suite test-nums))
60+
(interp-tests name typechecker passes use-interp test-suite test-nums)
6161
(compiler-tests name typechecker passes test-suite test-nums)
6262
(newline)(display "tests passed")(newline))
6363

tests/s7_3.rkt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
(let ([x (vector 1 2 3 42)])
2-
(let ([y (vector-set! x 0 42)])
3-
(let ([z (vector-set! x 1 42)])
2+
(let ([y (vector-set! x 1 42)])
3+
(let ([z (vector-set! x 0 42)])
44
((lambda (vec) (vector-ref vec 3)) x))))
55

0 commit comments

Comments
 (0)