Issue #206 - Fix cyc-seq, and only do it as an optimization

This commit is contained in:
Justin Ethier 2017-07-18 17:41:33 -04:00
parent a8c5c559d3
commit f2db6235e0
2 changed files with 12 additions and 4 deletions

View file

@ -406,12 +406,12 @@
((define? expr) ((define? expr)
;; Global ;; Global
`(define ,(define->var expr) `(define ,(define->var expr)
,@(caddr (closure-convert (define->exp expr) globals)))) ,@(caddr (closure-convert (define->exp expr) globals *optimization-level*))))
((define-c? expr) ((define-c? expr)
expr) expr)
(else (else
(caddr ;; Strip off superfluous lambda (caddr ;; Strip off superfluous lambda
(closure-convert expr globals))))) (closure-convert expr globals *optimization-level*)))))
input-program)) input-program))
; (caddr ;; Strip off superfluous lambda ; (caddr ;; Strip off superfluous lambda
; (closure-convert input-program))) ; (closure-convert input-program)))

View file

@ -1441,7 +1441,13 @@
(else (else
(loop (cdr lst) (+ i 1)))))) (loop (cdr lst) (+ i 1))))))
(define (closure-convert exp globals) (define (closure-convert exp globals . opts)
(let ((optimization-level 2))
(if (pair? opts)
(set! optimization-level (car opts)))
(_closure-convert exp globals optimization-level)))
(define (_closure-convert exp globals optimization-level)
(define (convert exp self-var free-var-lst) (define (convert exp self-var free-var-lst)
(define (cc exp) (define (cc exp)
(cond (cond
@ -1491,7 +1497,9 @@
(cond (cond
;; If the lambda argument is not used, flag so the C code is ;; If the lambda argument is not used, flag so the C code is
;; all generated within the same function ;; all generated within the same function
((and (eq? (lambda-formals-type fn) 'args:fixed) ((and (> optimization-level 0)
(eq? (lambda-formals-type fn) 'args:fixed)
(pair? (lambda-formals->list fn))
(with-var (with-var
(car (lambda-formals->list fn)) (car (lambda-formals->list fn))
(lambda (var) (lambda (var)