Avoid having (read) as an atom in Cvar language

This commit is contained in:
Enrico Lumetti 2021-05-05 20:54:44 +02:00
parent ec8e75232e
commit 44a453a062
3 changed files with 26 additions and 8 deletions

View File

@ -6,10 +6,10 @@
; remove complex sub-expression
; the resulting code is either
; - (read)
; - a number literal
; - a symbol
; the three above are called in the following "simple terms"
; - (read)
; - (- x) where x is a simple term
; - (+ x y) where x and y are simple terms
; - (let ([var y]) z) where y and z are expressions
@ -61,7 +61,13 @@
(match exp
[(? fixnum?) (values exp '() tmpcount)]
[(? symbol?) (values exp '() tmpcount)]
[`(read) (values exp '() tmpcount)]
[`(read)
(begin
(define new-tmpcount (+ tmpcount 1))
(define tmpname (get-unique-symbol new-tmpcount))
(values tmpname
(list `(,tmpname (read)))
new-tmpcount))]
[`(- ,e)
(begin
(define-values (new-exp assoc-list exp-tmpcount) (rco-arg e tmpcount))

View File

@ -19,8 +19,6 @@
`(program () (+ (let ([x (+ (- 1) 2)]) (+ x 2)) (+ 4 5)))))
(define (pass program) (explicate-control (remove-complex-opera* program)))
(test-eq

View File

@ -26,11 +26,21 @@
`(program () (let ([x (let ([x 1]) x)]) (+ 2 x)))
`(program ()
(let ([y (let ([x 20])
(+ x (let ([x 22]) x)))]) y))))
(+ x (let ([x 22]) x)))]) y))
`(program ()
(+ (read) (read)))))
(for ([program programs] [env (build-list (length programs) (lambda (_) '()))])
(test-eq ((interp-R1 env) program)
((interp-R1 env) (remove-complex-opera* program))))
(define inputs
(let ([empty-inputs (build-list (length programs) (lambda (_) ""))])
(list-set empty-inputs 13 "2\n3")))
(for ([program programs]
[env (build-list (length programs) (lambda (_) '()))]
[input-string inputs])
(test-eq (with-input-from-string input-string
(lambda () ((interp-R1 env) program)))
(with-input-from-string input-string
(lambda () ((interp-R1 env) (remove-complex-opera* program))))))
(test-eq
(remove-complex-opera* (list-ref programs 0))
@ -95,3 +105,7 @@
(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)))
(test-eq
(remove-complex-opera* (list-ref programs 13))
`(program () (let ((tmp.1 (read))) (let ((tmp.2 (read))) (+ tmp.1 tmp.2)))))