diff --git a/scheme/cyclone/cps-optimizations.sld b/scheme/cyclone/cps-optimizations.sld index 69681e9f..4680c2f1 100644 --- a/scheme/cyclone/cps-optimizations.sld +++ b/scheme/cyclone/cps-optimizations.sld @@ -28,6 +28,7 @@ optimize-cps analyze-cps opt:contract + contract-prims adb:clear! adb:get adb:get/default @@ -415,6 +416,44 @@ (else (error "CPS optimize [1] - Unknown expression" exp)))) + (define (contract-prims exp) + (cond + ((const? exp) exp) + ((quote? exp) exp) + ((ref? exp) exp) + ((ast:lambda? exp) + (ast:%make-lambda + (ast:lambda-id exp) + (ast:lambda-args exp) + (map contract-prims (ast:lambda-body exp)))) + ((define? exp) + `(define ,(define->var exp) + ,(contract-prims (define->exp exp)))) + ((set!? exp) + `(set! ,(set!->var exp) + ,(contract-prims (set!->exp exp)))) + ((if? exp) `(if ,(contract-prims (if->condition exp)) + ,(contract-prims (if->then exp)) + ,(contract-prims (if->else exp)))) + ; Application: + ((app? exp) + (cond + ((ast:lambda? exp) + 'TODO) + (else + (map contract-prims exp)))) + (else + (error `(Unexpected expression passed to contract-prims ,exp))))) + + ;; Do all the expressions contain prim calls? +;; TODO: check for prim calls accepting no continuation + (define (all-prim-calls? exps) + (cond + ((null? exps) #t) + ((prim-call? (car exps)) + (all-prim-calls? (cdr exps))) + (else #f))) + (define (analyze-cps exp) (analyze exp -1) ;; Top-level is lambda ID -1 (analyze2 exp) ;; Second pass diff --git a/test-cps.scm b/test-cps.scm index 3151b724..84afd0e8 100644 --- a/test-cps.scm +++ b/test-cps.scm @@ -76,7 +76,7 @@ makes some assumptions about there only being one prim per function, I believe 0))))) ;; TODO: update -#;(#((record-marker) +(#((record-marker) #((record-marker) #f (id args body)) #(6 () @@ -88,20 +88,10 @@ makes some assumptions about there only being one prim per function, I believe #((record-marker) #f (id args body)) #(4 (x$3 y$2 z$1) - ((#((record-marker) - #((record-marker) #f (id args body)) - #(3 - (r$4) - ((#((record-marker) + ((write #((record-marker) #((record-marker) #f (id args body)) - #(2 - (r$3) - ((write #((record-marker) - #((record-marker) #f (id args body)) - #(1 (r$1) ((r$1 %halt)))) - r$3)))) - (cons x$3 r$4))))) - (cons y$2 z$1))))) + #(1 (r$1) ((r$1 %halt)))) + (cons x$3 (cons y$2 z$1)))))) 1 2 3))))