Skip to content

Commit cde6e03

Browse files
committed
fixed eq?
1 parent 70cfa59 commit cde6e03

11 files changed

+97
-52
lines changed

README.md

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ Compiler Course
55

66
## To do:
77
* Write Grammars for intermediate languages
8-
* Implement anonymous functions: `lambda.rkt`
9-
* Do: Look through S3 tests and think of more tests.
10-
* Read: `functions.rkt` for help with `lambda.rkt`
118

129
Notes for work:
1310

@@ -27,3 +24,5 @@ Notes for work:
2724
* Look in utilities for System V
2825
* Look in utilities for Debugging stuff (`check-passes`)
2926

27+
Coding guidelines:
28+
* No more than 80 columns per line.

dynamic-interp.rkt

+15-12
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,19 @@
6161
(let* ([elts (map recur es)]
6262
[tys (map get-tagged-type elts)])
6363
`(tagged ,(apply vector (map recur es)) (Vector ,@tys)))]
64-
[`(vector-set! ,e1 ,n ,e2)
65-
(let ([e1^ (recur e1)]
66-
[e2^ (recur e2)])
67-
(match e1^
68-
[`(tagged ,vec ,ty)
69-
(vector-set! vec n e2^)
70-
`(tagged (void) Void)]))]
71-
[`(vector-ref ,e ,n)
72-
(let ([e^ (recur e)])
73-
(match e^
74-
[`(tagged ,vec ,ty)
75-
(vector-ref vec n)]))]
64+
[`(vector-set! ,(app recur e1^) ,(app recur n^) ,(app recur e2^))
65+
(match e1^
66+
[`(tagged ,vec ,ty)
67+
(match n^
68+
[`(tagged ,n ,ty)
69+
(vector-set! vec n e2^)
70+
`(tagged (void) Void)])])]
71+
[`(vector-ref ,(app recur e^) ,(app recur n^))
72+
(match e^
73+
[`(tagged ,vec ,ty)
74+
(match n^
75+
[`(tagged ,n ,ty)
76+
(vector-ref vec n)])])]
7677
[`(let ([,x ,e]) ,body)
7778
(let ([v (recur e)])
7879
((interp-r7 (cons (cons x v) env)) body))]
@@ -101,3 +102,5 @@
101102
(define new-env (append (map cons xs new-args) lam-env))
102103
((interp-r7 new-env) body)]
103104
[else (error "interp-r7, expected function, not" f-val)]))])))
105+
106+

dynamic-typing.rkt

+40-19
Original file line numberDiff line numberDiff line change
@@ -26,44 +26,37 @@
2626
(lambda (e)
2727
(define recur (type-check env))
2828
(match e
29-
[`(vector-ref ,(app recur e t) ,i)
29+
[`(vector-ref ,(app recur e t) ,(app recur i it))
3030
(match t
3131
[`(Vector ,ts ...)
3232
(unless (and (exact-nonnegative-integer? i)
3333
(i . < . (length ts)))
34-
(error 'type-check "invalid index ~a" i))
34+
(error 'type-check "invalid index ~a in ~a" i e))
3535
(let ([t (list-ref ts i)])
3636
(values `(has-type (vector-ref ,e (has-type ,i Integer)) ,t)
3737
t))]
3838
[`(Vectorof ,t)
39-
(unless (exact-nonnegative-integer? i)
40-
(error 'type-check "invalid index ~a" i))
41-
(values `(has-type (vector-ref ,e (has-type ,i Integer)) ,t) t)]
39+
(values `(has-type (vector-ref ,e ,i) ,t) t)]
4240
[else (error "expected a vector in vector-ref, not" t)])]
43-
[`(vector-set! ,(app recur e-vec^ t-vec) ,i
44-
,(app recur e-arg^ t-arg) )
41+
[`(vector-set! ,(app recur e-vec^ t-vec) ,(app recur i it)
42+
,(app recur e-arg^ t-arg))
4543
(match t-vec
4644
[`(Vector ,ts ...)
4745
(unless (and (exact-nonnegative-integer? i)
4846
(i . < . (length ts)))
49-
(error 'type-check "invalid index ~a" i))
47+
(error 'type-check "invalid index ~a in ~a" i e))
5048
(unless (equal? (list-ref ts i) t-arg)
5149
(error 'type-check "type mismatch in vector-set! ~a ~a"
5250
(list-ref ts i) t-arg))
5351
(values `(has-type (vector-set! ,e-vec^
5452
(has-type ,i Integer)
5553
,e-arg^) Void) 'Void)]
5654
[`(Vectorof ,t)
57-
(unless (exact-nonnegative-integer? i)
58-
(error 'type-check "invalid index ~a" i))
5955
(unless (equal? t t-arg)
6056
(error 'type-check "type mismatch in vector-set! ~a ~a"
6157
t t-arg))
62-
(values `(has-type (vector-set! ,e-vec^
63-
(has-type ,i Integer)
64-
,e-arg^) Void) 'Void)]
65-
[else (error 'type-check
66-
"expected a vector in vector-set!, not ~a"
58+
(values `(has-type (vector-set! ,e-vec^ ,i ,e-arg^) Void) 'Void)]
59+
[else (error 'type-check "expected a vector in vector-set!, not ~a"
6760
t-vec)])]
6861
[`(inject ,(app recur new-e e-ty) ,ty)
6962
(cond
@@ -427,10 +420,38 @@
427420
[else ((super reveal-functions funs) e)])))
428421

429422

430-
))
431-
432-
433-
423+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
424+
;; select-instructions : C -> psuedo-x86
425+
426+
(define/override (select-instructions)
427+
(lambda (x)
428+
(vomit "select instructions" x)
429+
(match x
430+
[`(assign ,lhs (vector-ref ,e-vec (has-type ,i ,Integer)))
431+
#:when (not (number? i))
432+
(define lhs^ ((select-instructions) lhs))
433+
(define e-vec^ ((select-instructions) e-vec))
434+
(define i^ ((select-instructions) i))
435+
`((movq ,i^ (reg r11))
436+
(addq (int 1) (reg r11))
437+
(imulq (int 8) (reg r11))
438+
(addq ,e-vec^ (reg r11))
439+
(movq (deref r11 0) ,lhs^))]
440+
[`(assign ,lhs (vector-set! ,e-vec (has-type ,i ,Integer) ,e-arg))
441+
#:when (not (number? i))
442+
(define lhs^ ((select-instructions) lhs))
443+
(define e-vec^ ((select-instructions) e-vec))
444+
(define e-arg^ ((select-instructions) e-arg))
445+
(define i^ ((select-instructions) i))
446+
`((movq ,i^ (reg r11))
447+
(addq (int 1) (reg r11))
448+
(imulq (int 8) (reg r11))
449+
(addq ,e-vec^ (reg r11))
450+
(movq ,e-arg^ (deref r11 0))
451+
(movq (int 0) ,lhs^))]
452+
[else ((super select-instructions) x)])))
453+
454+
));; compile-R7
434455

435456

436457
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

interp.rkt

+11-2
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111

112112
(field [x86-ops (make-immutable-hash
113113
`((addq 2 ,+)
114+
(imulq 2 ,*)
114115
(subq 2 ,(lambda (s d) (- d s)))
115116
(negq 1 ,-)))])
116117

@@ -948,8 +949,6 @@
948949
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
949950
;; Interpreters for R6: type Any and inject/project
950951

951-
;; to do: support eq? on two things of type Any -Jeremy
952-
953952
(define interp-R6
954953
(class interp-R4
955954
(super-new)
@@ -977,6 +976,15 @@
977976
(match v
978977
[`(tagged ,v1 (,ts ... -> ,rt)) #t]
979978
[else #f]))]
979+
['eq? (lambda (v1 v2)
980+
(match (list v1 v2)
981+
[`((tagged ,v1^ ,ty1) (tagged ,v2^ ,ty2))
982+
(and (eq? v1^ v2^) (equal? ty1 ty2))]
983+
[else
984+
(cond [(or (and (fixnum? v1) (fixnum? v2))
985+
(and (boolean? v1) (boolean? v2))
986+
(and (vector? v1) (vector? v2)))
987+
(eq? v1 v2)])]))]
980988
[else (super interp-op op)]
981989
))
982990

@@ -1050,3 +1058,4 @@
10501058
))
10511059

10521060
)) ;; interp-R6
1061+

run-tests.rkt

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
(3 . ,(range 1 20))
4444
(4 . ,(range 0 8))
4545
(6 . ,(range 0 10))
46-
(7 . ,(range 0 8))
46+
(7 . ,(range 0 9))
4747
))
4848

4949
(define (suite-range x)

runtime.c

+3
Original file line numberDiff line numberDiff line change
@@ -486,5 +486,8 @@ void print_any(int64_t any) {
486486
case ANY_TAG_FUN:
487487
printf("#<procedure>");
488488
break;
489+
default:
490+
printf("unrecognized!");
491+
exit(-1);
489492
}
490493
}

tests/s7_3.rkt

+2-2
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 1 42)])
3-
(let ([z (vector-set! x 0 42)])
2+
(let ([voidy (vector-set! x 1 42)])
3+
(let ([voidy (vector-set! x 0 42)])
44
((lambda (vec) (vector-ref vec 3)) x))))
55

tests/s7_5.rkt

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
(define (hello) 24)
22
(define (world) 24)
33
(let ([x (vector 0 0)])
4-
(let ([y (vector-set! x 0 (hello))])
5-
(let ([z (vector-set! x 1 (world))])
6-
(+ (- 6) (+ (vector-ref x 0) (vector-ref x 1))))))
4+
(let ([y (hello)])
5+
(let ([z (world)])
6+
(let ([voidx (vector-set! x 0 (hello))])
7+
(let ([voidy (vector-set! x 1 z)]) ;; change z to (world) for bug -Jeremy
8+
(+ (- 6) (+ (vector-ref x 0) (vector-ref x 1)))
9+
)))))
10+

tests/s7_7.rkt

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
2-
(define (vector-foo vec) (vector-set! vec 0 42))
3-
(define (vector-foo-too vec) (vector-set! vec 1 42))
1+
(define (vector-foo vec)
2+
(let ([_ (vector-set! vec 0 42)])
3+
vec))
4+
(define (vector-foo-too vec)
5+
(let ([_ (vector-set! vec 1 42)])
6+
vec))
47
(define (vector-foo-three vec)
5-
(let ([veca (vector-set! vec 2 42)])
6-
(vector-ref veca 2)))
7-
(let ([x (vector-foo (vector-foo-too (vector-foo-three (vector 0 0 0))))])
8+
(let ([_ (vector-set! vec 2 42)])
9+
(vector-ref vec 2)))
10+
(let ([x (vector-foo-three (vector-foo-too (vector-foo (vector 0 0 0))))])
811
x)

utilities.rkt

+2
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,8 @@
396396
(control-fun 'wait)
397397
(cond [(eq? (control-fun 'status) 'done-ok)
398398
(let ([result (read-line (car progout))])
399+
(unless (not (eq? result eof))
400+
(error "error: program did not produce output"))
399401
(if (eq? (string->symbol result) (string->symbol output))
400402
(begin (display test-name)(display " ")(flush-output))
401403
(error (format "test ~a failed, output: ~a, expected ~a"

vectors.rkt

+5-4
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,10 @@
9797
(for/list ([e (in-list e*)]
9898
[n (in-naturals)])
9999
(let ([v (unique-var 'void)])
100-
`(assign ,v (has-type
101-
(vector-set! ,vec (has-type ,n Integer) ,e)
102-
Void)))))
100+
`(assign ,v
101+
(has-type
102+
(vector-set! ,vec (has-type ,n Integer) ,e)
103+
Void)))))
103104
`((if (has-type (collection-needed? ,size) Boolean)
104105
((collect ,size))
105106
())
@@ -243,7 +244,7 @@
243244
(lambda (x)
244245
(vomit "select instructions" x)
245246
(match x
246-
;[`(void) `(int 0)] I don't think this line is needed. -Jeremy
247+
[`(void) `(int 0)]
247248
[`(assign ,(app (select-instructions) lhs^) (void))
248249
`((movq (int 0) ,lhs^))]
249250
[`(assign ,lhs (has-type (allocate ,length) (Vector ,ts ...)))

0 commit comments

Comments
 (0)