WIP - contract-prims

This commit is contained in:
Justin Ethier 2016-06-03 23:59:54 -04:00
parent a62387cb03
commit e9ebc2f4e3

View file

@ -416,35 +416,57 @@
(else (else
(error "CPS optimize [1] - Unknown expression" exp)))) (error "CPS optimize [1] - Unknown expression" exp))))
(define (contract-prims exp) (define (contract-prims exp . refs*)
(let ((refs (if (null? refs*)
(make-hash-table)
(car refs*))))
;(trace:error `(contract-prims ,exp))
(cond (cond
((const? exp) exp) ((ref? exp)
((quote? exp) exp) ;; Replace lambda variables, if necessary
((ref? exp) exp) (let ((key (hash-table-ref/default refs exp #f)))
(if key
(contract-prims key refs)
exp)))
((ast:lambda? exp) ((ast:lambda? exp)
(ast:%make-lambda (ast:%make-lambda
(ast:lambda-id exp) (ast:lambda-id exp)
(ast:lambda-args exp) (ast:lambda-args exp)
(map contract-prims (ast:lambda-body exp)))) (map (lambda (b) (contract-prims b refs)) (ast:lambda-body exp))))
((const? exp) exp)
((quote? exp) exp)
((define? exp) ((define? exp)
`(define ,(define->var exp) `(define ,(define->var exp)
,(contract-prims (define->exp exp)))) ,(contract-prims (define->exp exp) refs)))
((set!? exp) ((set!? exp)
`(set! ,(set!->var exp) `(set! ,(set!->var exp)
,(contract-prims (set!->exp exp)))) ,(contract-prims (set!->exp exp) refs)))
((if? exp) `(if ,(contract-prims (if->condition exp)) ((if? exp) `(if ,(contract-prims (if->condition exp) refs)
,(contract-prims (if->then exp)) ,(contract-prims (if->then exp) refs)
,(contract-prims (if->else exp)))) ,(contract-prims (if->else exp) refs)))
; Application: ; Application:
((app? exp) ((app? exp)
;(trace:error `(app? ,exp ,(ast:lambda? (car exp))
; ,(length (cdr exp))
; ,(length (ast:lambda-formals->list (car exp)))
; ,(all-prim-calls? (cdr exp))))
(cond (cond
((and (ast:lambda? (car exp)) ((and (ast:lambda? (car exp))
;; TODO: check for more than one arg??
(equal? (length (cdr exp))
(length (ast:lambda-formals->list (car exp))))
(all-prim-calls? (cdr exp))) (all-prim-calls? (cdr exp)))
'TODO) (let ((args (cdr exp)))
(for-each
(lambda (param)
(hash-table-set! refs param (car args))
(set! args (cdr args)))
(ast:lambda-formals->list (car exp))))
(contract-prims (car (ast:lambda-body (car exp))) refs))
(else (else
(map contract-prims exp)))) (map (lambda (e) (contract-prims e refs)) exp))))
(else (else
(error `(Unexpected expression passed to contract-prims ,exp))))) (error `(Unexpected expression passed to contract-prims ,exp))))))
;; Do all the expressions contain prim calls? ;; Do all the expressions contain prim calls?
;; TODO: check for prim calls accepting no continuation ;; TODO: check for prim calls accepting no continuation