Experimenting with literal evaluation at compile time

This commit is contained in:
Justin Ethier 2015-04-07 22:55:14 -04:00
parent 73ec3a5c94
commit 3fc60627eb

View file

@ -1554,7 +1554,10 @@
((app? ast)
(let ((fn (app->fun ast)))
(if (lambda? fn)
(cond
;((literal-app? ast)
; (cps (apply (car ast) (cdr ast)) cont-ast))
((lambda? fn)
(cps-list (app->args ast)
(lambda (vals)
(cons (list
@ -1562,12 +1565,13 @@
(lambda->formals fn)
(cps-seq (cddr fn) ;(ast-subx fn)
cont-ast))
vals)))
vals))))
(else
(cps-list ast ;(ast-subx ast)
(lambda (args)
(cons (car args)
(cons cont-ast
(cdr args))))))))
(cdr args)))))))))
(else
(error "unknown ast" ast))))
@ -1615,6 +1619,21 @@
(cps ast '%halt))))
ast-cps))
(define (literal-app? ast)
(and
(pair? ast)
(prim? (car ast))
(not (equal? 'apply (car ast))) ;; Cannot always exec at compile time
(call/cc
(lambda (return)
(for-each
(lambda (expr)
(if (not (const? expr))
(return #f)))
(cdr ast))
#t))))
;; Closure-conversion.
;;
;; Closure conversion eliminates all of the free variables from every