mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-23 20:15:05 +02:00
WIP
This commit is contained in:
parent
18c8fbf260
commit
ef2adcdb11
2 changed files with 47 additions and 2 deletions
|
@ -424,6 +424,8 @@
|
||||||
(trace:info (ast:ast->pp-sexp input-program))
|
(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...
|
;; TODO: could do this, but it seems like a bit of a band-aid...
|
||||||
(set! input-program (opt:renumber-lambdas! input-program))
|
(set! input-program (opt:renumber-lambdas! input-program))
|
||||||
(trace:info "---------------- after renumber lambdas")
|
(trace:info "---------------- after renumber lambdas")
|
||||||
|
|
|
@ -32,6 +32,37 @@
|
||||||
(scan sexp #f)
|
(scan sexp #f)
|
||||||
(return #t))))
|
(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 (find-local-vars sexp)
|
||||||
(define (scan exp)
|
(define (scan exp)
|
||||||
(cond
|
(cond
|
||||||
|
@ -60,11 +91,22 @@
|
||||||
(ast:lambda? (car exp))
|
(ast:lambda? (car exp))
|
||||||
(equal? (length exp) 2)
|
(equal? (length exp) 2)
|
||||||
(ast:lambda? (cadr exp))
|
(ast:lambda? (cadr exp))
|
||||||
|
(equal? 1 (length (ast:lambda-args (cadr exp))))
|
||||||
(local-tail-call-only?
|
(local-tail-call-only?
|
||||||
(ast:lambda-body (car exp))
|
(ast:lambda-body (car exp))
|
||||||
(car (ast:lambda-args (car exp)))))
|
(car (ast:lambda-args (car exp)))))
|
||||||
(write `(tail-call-only? passed for ,exp)) (newline)
|
(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
|
(else
|
||||||
(map scan exp))))
|
(map scan exp))))
|
||||||
(else 'todo)
|
(else 'todo)
|
||||||
|
@ -105,4 +147,5 @@
|
||||||
; (ast:ast->pp-sexp
|
; (ast:ast->pp-sexp
|
||||||
; (ast:sexp->ast sexp)))
|
; (ast:sexp->ast sexp)))
|
||||||
|
|
||||||
(find-local-vars (ast:sexp->ast sexp))
|
(pretty-print
|
||||||
|
(find-local-vars (ast:sexp->ast sexp)))
|
||||||
|
|
Loading…
Add table
Reference in a new issue