Convert c1 to new EoC data structures

Don't port partial evaluator for the moment
This commit is contained in:
Enrico Lumetti 2021-10-05 15:12:14 +02:00
parent 5487761f54
commit bad45de00a
4 changed files with 49 additions and 25 deletions

24
c1.rkt
View File

@ -2,30 +2,6 @@
(require racket/fixnum) (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) (define (pe-arith p)
(match p (match p
[`(program ,e) (pe-exp e)])) [`(program ,e) (pe-exp e)]))

28
rint.rkt Normal file
View File

@ -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)]))

15
test-rint.rkt Normal file
View File

@ -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))))

View File

@ -1,8 +1,13 @@
#lang racket #lang racket
(require racket/system) (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) (define (test-eq a b)
(if (equal? a b) (displayln "PASS") (error (format "FAIL: ~a != ~a" a b)))) (if (equal? a b) (displayln "PASS") (error (format "FAIL: ~a != ~a" a b))))