From ef2adcdb11821095d1484559703503d35779980a Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Sat, 10 Nov 2018 05:55:49 -0500 Subject: [PATCH] WIP --- cyclone.scm | 2 ++ test-find-local-vars.scm | 47 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/cyclone.scm b/cyclone.scm index 9e4cd7bd..b277aef6 100644 --- a/cyclone.scm +++ b/cyclone.scm @@ -424,6 +424,8 @@ (trace:info (ast:ast->pp-sexp input-program)) ) +;; TODO: would want to introduce lets right here, at least to start + ;; TODO: could do this, but it seems like a bit of a band-aid... (set! input-program (opt:renumber-lambdas! input-program)) (trace:info "---------------- after renumber lambdas") diff --git a/test-find-local-vars.scm b/test-find-local-vars.scm index ee51ce98..6c0046d8 100644 --- a/test-find-local-vars.scm +++ b/test-find-local-vars.scm @@ -32,6 +32,37 @@ (scan sexp #f) (return #t)))) +(define (tail-calls->values sexp sym) + (call/cc + (lambda (return) + (define (scan exp) + (write `(DEBUG scan ,exp)) (newline) + (cond + ((ast:lambda? exp) + (return #f)) ;; Could be OK if not ref'd... + ((ref? exp) + (if (equal? exp sym) + (return #f))) ;; Assume not a tail call + ((define? exp) + (return #f)) ;; Fail fast + ((set!? exp) + (return #f)) ;; Fail fast + ((if? exp) + `(if ,(if->condition exp) + ,(scan (if->then exp)) + ,(scan (if->else exp)))) + ((app? exp) + (cond + ((and (equal? (car exp) sym) + (= (length exp) 2) + ) + (cadr exp)) + (else + (return #f)))) + (else exp))) + (return + (scan sexp))))) + (define (find-local-vars sexp) (define (scan exp) (cond @@ -60,11 +91,22 @@ (ast:lambda? (car exp)) (equal? (length exp) 2) (ast:lambda? (cadr exp)) + (equal? 1 (length (ast:lambda-args (cadr exp)))) (local-tail-call-only? (ast:lambda-body (car exp)) (car (ast:lambda-args (car exp))))) (write `(tail-call-only? passed for ,exp)) (newline) - 'TODO) + (write `(replace with ,(tail-calls->values + (car (ast:lambda-body (car exp))) + (car (ast:lambda-args (car exp)))))) + (newline) + (let ((value (tail-calls->values + (car (ast:lambda-body (car exp))) + (car (ast:lambda-args (car exp))))) + (var (car (ast:lambda-args (cadr exp)))) + (body (ast:lambda-body (cadr exp)))) + `((let ((,var ,value)) + ,body)))) (else (map scan exp)))) (else 'todo) @@ -105,4 +147,5 @@ ; (ast:ast->pp-sexp ; (ast:sexp->ast sexp))) -(find-local-vars (ast:sexp->ast sexp)) +(pretty-print + (find-local-vars (ast:sexp->ast sexp)))