#lang racket (require "test-util.rkt") (require "remove-complex-oper.rkt") (require "c2.rkt") (define programs (list `(program () (- 20)) `(program () (- (- 20))) `(program () (- (- (- 20)))) `(program () (+ 3 (- 20))) `(program () (+ (+ 3 2) (+ 4 5))) `(program () (let ([x 1]) x)) `(program () (let ([x (+ (- 2) 3)]) (+ x (+ 2 3)))) `(program () (+ (let ([x (+ (- 1) 2)]) (+ x 2)) (+ 4 5))) `(program () (let ([a 42]) (let ([b a]) b))) `(program () (let ([tmp (- 1)]) tmp)) `(program () (- (let ([x 1]) x))) `(program () (let ([x (let ([x 1]) x)]) (+ 2 x))) `(program () (let ([y (let ([x 20]) (+ x (let ([x 22]) x)))]) y)))) (for ([program programs] [env (build-list (length programs) (lambda (_) '()))]) (test-eq ((interp-R1 env) program) ((interp-R1 env) (remove-complex-opera* program)))) (test-eq (remove-complex-opera* (list-ref programs 0)) `(program () (- 20))) (test-eq (remove-complex-opera* (list-ref programs 1)) `(program () (let ([tmp.1 (- 20)]) (- tmp.1)))) (test-eq (remove-complex-opera* (list-ref programs 2)) `(program () (let ([tmp.1 (- 20)]) (let ([tmp.2 (- tmp.1)]) (- tmp.2))))) (test-eq (remove-complex-opera* (list-ref programs 3)) `(program () (let ((tmp.1 (- 20))) (+ 3 tmp.1)))) (test-eq (remove-complex-opera* (list-ref programs 4)) `(program () (let ((tmp.1 (+ 3 2))) (let ((tmp.2 (+ 4 5))) (+ tmp.1 tmp.2))))) (test-eq (remove-complex-opera* (list-ref programs 5)) `(program () (let ((x.1 1)) x.1))) (test-eq (remove-complex-opera* (list-ref programs 6)) `(program () (let ((x.1 (let ((tmp.1 (- 2))) (+ tmp.1 3)))) (let ((tmp.2 (+ 2 3))) (+ x.1 tmp.2))))) (test-eq (remove-complex-opera* (list-ref programs 7)) `(program () (let ((x.1 (let ((tmp.1 (- 1))) (+ tmp.1 2)))) (let ((tmp.2 (+ x.1 2))) (let ((tmp.3 (+ 4 5))) (+ tmp.2 tmp.3)))))) (test-eq (remove-complex-opera* (list-ref programs 8)) `(program () (let([a.1 42]) (let ([b.1 a.1]) b.1)))) (test-eq (remove-complex-opera* (list-ref programs 9)) `(program () (let ([tmp.1 (- 1)]) tmp.1))) (test-eq (remove-complex-opera* (list-ref programs 10)) `(program () (let ((x.1 1)) (- x.1)))) (test-eq (remove-complex-opera* (list-ref programs 11)) `(program () (let ((x.1 (let ((x.2 1)) x.2))) (+ 2 x.1)))) (test-eq (remove-complex-opera* (list-ref programs 12)) `(program () (let ((y.1 (let ((x.1 20)) (let ((x.2 22)) (+ x.1 x.2))))) y.1)))