From bad45de00a0955f46873ca1c77d26f8b4521d7a4 Mon Sep 17 00:00:00 2001 From: Enrico Lumetti Date: Tue, 5 Oct 2021 15:12:14 +0200 Subject: [PATCH] Convert c1 to new EoC data structures Don't port partial evaluator for the moment --- c1.rkt | 24 ------------------------ rint.rkt | 28 ++++++++++++++++++++++++++++ test-rint.rkt | 15 +++++++++++++++ test-util.rkt | 7 ++++++- 4 files changed, 49 insertions(+), 25 deletions(-) create mode 100644 rint.rkt create mode 100644 test-rint.rkt diff --git a/c1.rkt b/c1.rkt index b4f25d3..f2c1a2e 100644 --- a/c1.rkt +++ b/c1.rkt @@ -2,30 +2,6 @@ (require racket/fixnum) -(define ast1.4 `(- 8)) -(define ast1.1 `(+ (read) ,ast1.4)) - -(define (read-fixnum) - (let ([r (read)]) - (cond - [(fixnum? r) r] - [else (error "invalid fixnum in input: " r)]))) - - -(define (interp-exp sexp) - (match sexp - [(? fixnum?) sexp] - [`(read) (read-fixnum)] - [`(- ,e) (fx- 0 (interp-exp e))] - [`(+ ,e1 ,e2) (fx+ (interp-exp e1) (interp-exp e2))])) - - -(define (interp-R0 p) - (match p - [`(program ,e) (interp-exp e)])) - - - (define (pe-arith p) (match p [`(program ,e) (pe-exp e)])) diff --git a/rint.rkt b/rint.rkt new file mode 100644 index 0000000..d91bdaf --- /dev/null +++ b/rint.rkt @@ -0,0 +1,28 @@ +#lang racket + +(require racket/fixnum) + +(provide Int Prim Program interp-RInt) + +(struct Int (value)) +(struct Prim (op args)) + +(struct Program (info body)) + +(define (read-fixnum) + (let ([r (read)]) + (cond + [(fixnum? r) r] + [else (error "invalid fixnum in input: " r)]))) + + +(define (interp-exp sexp) + (match sexp + [(Int n) n] + [(Prim 'read '()) (read-fixnum)] + [(Prim '- (list e)) (fx- 0 (interp-exp e))] + [(Prim '+ (list e1 e2)) (fx+ (interp-exp e1) (interp-exp e2))])) + +(define (interp-RInt p) + (match p + [(Program '() body) (interp-exp body)])) diff --git a/test-rint.rkt b/test-rint.rkt new file mode 100644 index 0000000..1eb8855 --- /dev/null +++ b/test-rint.rkt @@ -0,0 +1,15 @@ +#lang racket + +(require "test-util.rkt") +(require "rint.rkt") + +(define eight (Int 8)) +(define rd (Prim 'read '())) +(define neg-eight (Prim '- (list eight))) +(define ast1.1 (Prim '+ (list rd neg-eight))) +(define program (Program '() ast1.1)) + +(test-eq -5 + (with-input-from-num-list '(3) + (lambda () (interp-RInt program)))) + diff --git a/test-util.rkt b/test-util.rkt index 60388d2..bcba7be 100644 --- a/test-util.rkt +++ b/test-util.rkt @@ -1,8 +1,13 @@ #lang racket (require racket/system) +(require racket/port) -(provide test-eq compile-arm-asm run-arm-executable) +(provide test-eq with-input-from-num-list compile-arm-asm run-arm-executable) + +(define (with-input-from-num-list ls proc) + (with-input-from-string (string-join (map number->string ls) "\n") + proc)) (define (test-eq a b) (if (equal? a b) (displayln "PASS") (error (format "FAIL: ~a != ~a" a b))))